1/*
2   +----------------------------------------------------------------------+
3   | PHP Version 5                                                        |
4   +----------------------------------------------------------------------+
5   | Copyright (c) 1997-2015 The PHP Group                                |
6   +----------------------------------------------------------------------+
7   | This source file is subject to version 3.01 of the PHP license,      |
8   | that is bundled with this package in the file LICENSE, and is        |
9   | available through the world-wide-web at the following url:           |
10   | http://www.php.net/license/3_01.txt                                  |
11   | If you did not receive a copy of the PHP license and are unable to   |
12   | obtain it through the world-wide-web, please send a note to          |
13   | license@php.net so we can mail you a copy immediately.               |
14   +----------------------------------------------------------------------+
15   | Authors: Andi Gutmans <andi@zend.com>                                |
16   |          Zeev Suraski <zeev@zend.com>                                |
17   +----------------------------------------------------------------------+
18 */
19
20/* $Id$ */
21
22#include "php.h"
23#include "php_streams.h"
24#include "php_main.h"
25#include "php_globals.h"
26#include "php_ini.h"
27#include "php_standard.h"
28#include "php_math.h"
29#include "php_http.h"
30#include "php_incomplete_class.h"
31#include "php_getopt.h"
32#include "ext/standard/info.h"
33#include "ext/session/php_session.h"
34#include "zend_operators.h"
35#include "ext/standard/php_dns.h"
36#include "ext/standard/php_uuencode.h"
37
38#ifdef PHP_WIN32
39#include "win32/php_win32_globals.h"
40#include "win32/time.h"
41#endif
42
43typedef struct yy_buffer_state *YY_BUFFER_STATE;
44
45#include "zend.h"
46#include "zend_ini_scanner.h"
47#include "zend_language_scanner.h"
48#include <zend_language_parser.h>
49
50#include <stdarg.h>
51#include <stdlib.h>
52#include <math.h>
53#include <time.h>
54#include <stdio.h>
55
56#ifndef PHP_WIN32
57#include <sys/types.h>
58#include <sys/stat.h>
59#endif
60
61#ifdef NETWARE
62#include <netinet/in.h>
63#endif
64
65#ifndef PHP_WIN32
66# include <netdb.h>
67#else
68#include "win32/inet.h"
69#endif
70
71#if HAVE_ARPA_INET_H
72# include <arpa/inet.h>
73#endif
74
75#if HAVE_UNISTD_H
76# include <unistd.h>
77#endif
78
79#if HAVE_STRING_H
80# include <string.h>
81#else
82# include <strings.h>
83#endif
84
85#if HAVE_LOCALE_H
86# include <locale.h>
87#endif
88
89#if HAVE_SYS_MMAN_H
90# include <sys/mman.h>
91#endif
92
93#if HAVE_SYS_LOADAVG_H
94# include <sys/loadavg.h>
95#endif
96
97#ifdef PHP_WIN32
98# include "win32/unistd.h"
99#endif
100
101#ifndef INADDR_NONE
102#define INADDR_NONE ((unsigned long int) -1)
103#endif
104
105#include "zend_globals.h"
106#include "php_globals.h"
107#include "SAPI.h"
108#include "php_ticks.h"
109
110#ifdef ZTS
111PHPAPI int basic_globals_id;
112#else
113PHPAPI php_basic_globals basic_globals;
114#endif
115
116#include "php_fopen_wrappers.h"
117#include "streamsfuncs.h"
118
119static zend_class_entry *incomplete_class_entry = NULL;
120
121typedef struct _user_tick_function_entry {
122    zval **arguments;
123    int arg_count;
124    int calling;
125} user_tick_function_entry;
126
127/* some prototypes for local functions */
128static void user_shutdown_function_dtor(php_shutdown_function_entry *shutdown_function_entry);
129static void user_tick_function_dtor(user_tick_function_entry *tick_function_entry);
130
131static HashTable basic_submodules;
132
133#undef sprintf
134
135/* {{{ arginfo */
136/* {{{ main/main.c */
137ZEND_BEGIN_ARG_INFO(arginfo_set_time_limit, 0)
138    ZEND_ARG_INFO(0, seconds)
139ZEND_END_ARG_INFO()
140/* }}} */
141
142/* {{{ main/sapi.c */
143ZEND_BEGIN_ARG_INFO(arginfo_header_register_callback, 0)
144    ZEND_ARG_INFO(0, callback)
145ZEND_END_ARG_INFO()
146/* }}} */
147
148/* {{{ main/output.c */
149ZEND_BEGIN_ARG_INFO_EX(arginfo_ob_start, 0, 0, 0)
150    ZEND_ARG_INFO(0, user_function)
151    ZEND_ARG_INFO(0, chunk_size)
152    ZEND_ARG_INFO(0, flags)
153ZEND_END_ARG_INFO()
154
155ZEND_BEGIN_ARG_INFO(arginfo_ob_flush, 0)
156ZEND_END_ARG_INFO()
157
158ZEND_BEGIN_ARG_INFO(arginfo_ob_clean, 0)
159ZEND_END_ARG_INFO()
160
161ZEND_BEGIN_ARG_INFO(arginfo_ob_end_flush, 0)
162ZEND_END_ARG_INFO()
163
164ZEND_BEGIN_ARG_INFO(arginfo_ob_end_clean, 0)
165ZEND_END_ARG_INFO()
166
167ZEND_BEGIN_ARG_INFO(arginfo_ob_get_flush, 0)
168ZEND_END_ARG_INFO()
169
170ZEND_BEGIN_ARG_INFO(arginfo_ob_get_clean, 0)
171ZEND_END_ARG_INFO()
172
173ZEND_BEGIN_ARG_INFO(arginfo_ob_get_contents, 0)
174ZEND_END_ARG_INFO()
175
176ZEND_BEGIN_ARG_INFO(arginfo_ob_get_level, 0)
177ZEND_END_ARG_INFO()
178
179ZEND_BEGIN_ARG_INFO(arginfo_ob_get_length, 0)
180ZEND_END_ARG_INFO()
181
182ZEND_BEGIN_ARG_INFO(arginfo_ob_list_handlers, 0)
183ZEND_END_ARG_INFO()
184
185ZEND_BEGIN_ARG_INFO_EX(arginfo_ob_get_status, 0, 0, 0)
186    ZEND_ARG_INFO(0, full_status)
187ZEND_END_ARG_INFO()
188
189ZEND_BEGIN_ARG_INFO_EX(arginfo_ob_implicit_flush, 0, 0, 0)
190    ZEND_ARG_INFO(0, flag)
191ZEND_END_ARG_INFO()
192
193ZEND_BEGIN_ARG_INFO(arginfo_output_reset_rewrite_vars, 0)
194ZEND_END_ARG_INFO()
195
196ZEND_BEGIN_ARG_INFO(arginfo_output_add_rewrite_var, 0)
197    ZEND_ARG_INFO(0, name)
198    ZEND_ARG_INFO(0, value)
199ZEND_END_ARG_INFO()
200/* }}} */
201/* {{{ main/streams/userspace.c */
202ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_wrapper_register, 0, 0, 2)
203    ZEND_ARG_INFO(0, protocol)
204    ZEND_ARG_INFO(0, classname)
205    ZEND_ARG_INFO(0, flags)
206ZEND_END_ARG_INFO()
207
208ZEND_BEGIN_ARG_INFO(arginfo_stream_wrapper_unregister, 0)
209    ZEND_ARG_INFO(0, protocol)
210ZEND_END_ARG_INFO()
211
212ZEND_BEGIN_ARG_INFO(arginfo_stream_wrapper_restore, 0)
213    ZEND_ARG_INFO(0, protocol)
214ZEND_END_ARG_INFO()
215/* }}} */
216/* {{{ array.c */
217ZEND_BEGIN_ARG_INFO_EX(arginfo_krsort, 0, 0, 1)
218    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
219    ZEND_ARG_INFO(0, sort_flags)
220ZEND_END_ARG_INFO()
221
222ZEND_BEGIN_ARG_INFO_EX(arginfo_ksort, 0, 0, 1)
223    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
224    ZEND_ARG_INFO(0, sort_flags)
225ZEND_END_ARG_INFO()
226
227ZEND_BEGIN_ARG_INFO_EX(arginfo_count, 0, 0, 1)
228    ZEND_ARG_INFO(0, var)
229    ZEND_ARG_INFO(0, mode)
230ZEND_END_ARG_INFO()
231
232ZEND_BEGIN_ARG_INFO(arginfo_natsort, 0)
233    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
234ZEND_END_ARG_INFO()
235
236ZEND_BEGIN_ARG_INFO(arginfo_natcasesort, 0)
237    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
238ZEND_END_ARG_INFO()
239
240ZEND_BEGIN_ARG_INFO_EX(arginfo_asort, 0, 0, 1)
241    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
242    ZEND_ARG_INFO(0, sort_flags)
243ZEND_END_ARG_INFO()
244
245ZEND_BEGIN_ARG_INFO_EX(arginfo_arsort, 0, 0, 1)
246    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
247    ZEND_ARG_INFO(0, sort_flags)
248ZEND_END_ARG_INFO()
249
250ZEND_BEGIN_ARG_INFO_EX(arginfo_sort, 0, 0, 1)
251    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
252    ZEND_ARG_INFO(0, sort_flags)
253ZEND_END_ARG_INFO()
254
255ZEND_BEGIN_ARG_INFO_EX(arginfo_rsort, 0, 0, 1)
256    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
257    ZEND_ARG_INFO(0, sort_flags)
258ZEND_END_ARG_INFO()
259
260ZEND_BEGIN_ARG_INFO(arginfo_usort, 0)
261    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
262    ZEND_ARG_INFO(0, cmp_function)
263ZEND_END_ARG_INFO()
264
265ZEND_BEGIN_ARG_INFO(arginfo_uasort, 0)
266    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
267    ZEND_ARG_INFO(0, cmp_function)
268ZEND_END_ARG_INFO()
269
270ZEND_BEGIN_ARG_INFO(arginfo_uksort, 0)
271    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
272    ZEND_ARG_INFO(0, cmp_function)
273ZEND_END_ARG_INFO()
274
275ZEND_BEGIN_ARG_INFO(arginfo_end, 0)
276    ZEND_ARG_INFO(1, arg)
277ZEND_END_ARG_INFO()
278
279ZEND_BEGIN_ARG_INFO(arginfo_prev, 0)
280    ZEND_ARG_INFO(1, arg)
281ZEND_END_ARG_INFO()
282
283ZEND_BEGIN_ARG_INFO(arginfo_next, 0)
284    ZEND_ARG_INFO(1, arg)
285ZEND_END_ARG_INFO()
286
287ZEND_BEGIN_ARG_INFO(arginfo_reset, 0)
288    ZEND_ARG_INFO(1, arg)
289ZEND_END_ARG_INFO()
290
291ZEND_BEGIN_ARG_INFO(arginfo_current, 0)
292    ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, arg)
293ZEND_END_ARG_INFO()
294
295ZEND_BEGIN_ARG_INFO(arginfo_key, 0)
296    ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, arg)
297ZEND_END_ARG_INFO()
298
299ZEND_BEGIN_ARG_INFO_EX(arginfo_min, 0, 0, 1)
300    ZEND_ARG_VARIADIC_INFO(0, args)
301ZEND_END_ARG_INFO()
302
303ZEND_BEGIN_ARG_INFO_EX(arginfo_max, 0, 0, 1)
304    ZEND_ARG_VARIADIC_INFO(0, args)
305ZEND_END_ARG_INFO()
306
307ZEND_BEGIN_ARG_INFO_EX(arginfo_array_walk, 0, 0, 2)
308    ZEND_ARG_INFO(1, input) /* ARRAY_INFO(1, arg, 0) */
309    ZEND_ARG_INFO(0, funcname)
310    ZEND_ARG_INFO(0, userdata)
311ZEND_END_ARG_INFO()
312
313ZEND_BEGIN_ARG_INFO_EX(arginfo_array_walk_recursive, 0, 0, 2)
314    ZEND_ARG_INFO(1, input) /* ARRAY_INFO(1, arg, 0) */
315    ZEND_ARG_INFO(0, funcname)
316    ZEND_ARG_INFO(0, userdata)
317ZEND_END_ARG_INFO()
318
319ZEND_BEGIN_ARG_INFO_EX(arginfo_in_array, 0, 0, 2)
320    ZEND_ARG_INFO(0, needle)
321    ZEND_ARG_INFO(0, haystack) /* ARRAY_INFO(0, haystack, 0) */
322    ZEND_ARG_INFO(0, strict)
323ZEND_END_ARG_INFO()
324
325ZEND_BEGIN_ARG_INFO_EX(arginfo_array_search, 0, 0, 2)
326    ZEND_ARG_INFO(0, needle)
327    ZEND_ARG_INFO(0, haystack) /* ARRAY_INFO(0, haystack, 0) */
328    ZEND_ARG_INFO(0, strict)
329ZEND_END_ARG_INFO()
330
331ZEND_BEGIN_ARG_INFO_EX(arginfo_extract, 0, 0, 1)
332    ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, arg) /* ARRAY_INFO(0, arg, 0) */
333    ZEND_ARG_INFO(0, extract_type)
334    ZEND_ARG_INFO(0, prefix)
335ZEND_END_ARG_INFO()
336
337ZEND_BEGIN_ARG_INFO_EX(arginfo_compact, 0, 0, 1)
338    ZEND_ARG_VARIADIC_INFO(0, var_names)
339ZEND_END_ARG_INFO()
340
341ZEND_BEGIN_ARG_INFO(arginfo_array_fill, 0)
342    ZEND_ARG_INFO(0, start_key)
343    ZEND_ARG_INFO(0, num)
344    ZEND_ARG_INFO(0, val)
345ZEND_END_ARG_INFO()
346
347ZEND_BEGIN_ARG_INFO(arginfo_array_fill_keys, 0)
348    ZEND_ARG_INFO(0, keys) /* ARRAY_INFO(0, keys, 0) */
349    ZEND_ARG_INFO(0, val)
350ZEND_END_ARG_INFO()
351
352ZEND_BEGIN_ARG_INFO_EX(arginfo_range, 0, 0, 2)
353    ZEND_ARG_INFO(0, low)
354    ZEND_ARG_INFO(0, high)
355    ZEND_ARG_INFO(0, step)
356ZEND_END_ARG_INFO()
357
358ZEND_BEGIN_ARG_INFO(arginfo_shuffle, 0)
359    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
360ZEND_END_ARG_INFO()
361
362ZEND_BEGIN_ARG_INFO_EX(arginfo_array_push, 0, 0, 2)
363    ZEND_ARG_INFO(1, stack) /* ARRAY_INFO(1, stack, 0) */
364    ZEND_ARG_VARIADIC_INFO(0, vars)
365ZEND_END_ARG_INFO()
366
367ZEND_BEGIN_ARG_INFO(arginfo_array_pop, 0)
368    ZEND_ARG_INFO(1, stack) /* ARRAY_INFO(1, stack, 0) */
369ZEND_END_ARG_INFO()
370
371ZEND_BEGIN_ARG_INFO(arginfo_array_shift, 0)
372    ZEND_ARG_INFO(1, stack) /* ARRAY_INFO(1, stack, 0) */
373ZEND_END_ARG_INFO()
374
375ZEND_BEGIN_ARG_INFO_EX(arginfo_array_unshift, 0, 0, 2)
376    ZEND_ARG_INFO(1, stack) /* ARRAY_INFO(1, stack, 0) */
377    ZEND_ARG_VARIADIC_INFO(0, vars)
378ZEND_END_ARG_INFO()
379
380ZEND_BEGIN_ARG_INFO_EX(arginfo_array_splice, 0, 0, 2)
381    ZEND_ARG_INFO(1, arg) /* ARRAY_INFO(1, arg, 0) */
382    ZEND_ARG_INFO(0, offset)
383    ZEND_ARG_INFO(0, length)
384    ZEND_ARG_INFO(0, replacement) /* ARRAY_INFO(0, arg, 1) */
385ZEND_END_ARG_INFO()
386
387ZEND_BEGIN_ARG_INFO_EX(arginfo_array_slice, 0, 0, 2)
388    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(1, arg, 0) */
389    ZEND_ARG_INFO(0, offset)
390    ZEND_ARG_INFO(0, length)
391    ZEND_ARG_INFO(0, preserve_keys)
392ZEND_END_ARG_INFO()
393
394ZEND_BEGIN_ARG_INFO_EX(arginfo_array_merge, 0, 0, 2)
395    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg, 0) */
396    ZEND_ARG_VARIADIC_INFO(0, arrays)
397ZEND_END_ARG_INFO()
398
399ZEND_BEGIN_ARG_INFO_EX(arginfo_array_merge_recursive, 0, 0, 2)
400    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg, 0) */
401    ZEND_ARG_VARIADIC_INFO(0, arrays)
402ZEND_END_ARG_INFO()
403
404ZEND_BEGIN_ARG_INFO_EX(arginfo_array_replace, 0, 0, 2)
405    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg, 0) */
406    ZEND_ARG_VARIADIC_INFO(0, arrays)
407ZEND_END_ARG_INFO()
408
409ZEND_BEGIN_ARG_INFO_EX(arginfo_array_replace_recursive, 0, 0, 2)
410    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg, 0) */
411    ZEND_ARG_VARIADIC_INFO(0, arrays)
412ZEND_END_ARG_INFO()
413
414ZEND_BEGIN_ARG_INFO_EX(arginfo_array_keys, 0, 0, 1)
415    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
416    ZEND_ARG_INFO(0, search_value)
417    ZEND_ARG_INFO(0, strict)
418ZEND_END_ARG_INFO()
419
420ZEND_BEGIN_ARG_INFO(arginfo_array_values, 0)
421    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
422ZEND_END_ARG_INFO()
423
424ZEND_BEGIN_ARG_INFO(arginfo_array_count_values, 0)
425    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
426ZEND_END_ARG_INFO()
427
428ZEND_BEGIN_ARG_INFO_EX(arginfo_array_column, 0, 0, 2)
429    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
430    ZEND_ARG_INFO(0, column_key)
431    ZEND_ARG_INFO(0, index_key)
432ZEND_END_ARG_INFO()
433
434ZEND_BEGIN_ARG_INFO_EX(arginfo_array_reverse, 0, 0, 1)
435    ZEND_ARG_INFO(0, input) /* ARRAY_INFO(0, arg, 0) */
436    ZEND_ARG_INFO(0, preserve_keys)
437ZEND_END_ARG_INFO()
438
439ZEND_BEGIN_ARG_INFO(arginfo_array_pad, 0)
440    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
441    ZEND_ARG_INFO(0, pad_size)
442    ZEND_ARG_INFO(0, pad_value)
443ZEND_END_ARG_INFO()
444
445ZEND_BEGIN_ARG_INFO(arginfo_array_flip, 0)
446    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
447ZEND_END_ARG_INFO()
448
449ZEND_BEGIN_ARG_INFO_EX(arginfo_array_change_key_case, 0, 0, 1)
450    ZEND_ARG_INFO(0, input) /* ARRAY_INFO(0, arg, 0) */
451    ZEND_ARG_INFO(0, case)
452ZEND_END_ARG_INFO()
453
454ZEND_BEGIN_ARG_INFO(arginfo_array_unique, 0)
455    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
456ZEND_END_ARG_INFO()
457
458ZEND_BEGIN_ARG_INFO_EX(arginfo_array_intersect_key, 0, 0, 2)
459    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
460    ZEND_ARG_VARIADIC_INFO(0, arrays)
461ZEND_END_ARG_INFO()
462
463ZEND_BEGIN_ARG_INFO(arginfo_array_intersect_ukey, 0)
464    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
465    ZEND_ARG_INFO(0, arr2) /* ARRAY_INFO(0, arg2, 0) */
466    ZEND_ARG_INFO(0, callback_key_compare_func)
467ZEND_END_ARG_INFO()
468
469ZEND_BEGIN_ARG_INFO_EX(arginfo_array_intersect, 0, 0, 2)
470    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
471    ZEND_ARG_VARIADIC_INFO(0, arrays)
472ZEND_END_ARG_INFO()
473
474ZEND_BEGIN_ARG_INFO(arginfo_array_uintersect, 0)
475    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
476    ZEND_ARG_INFO(0, arr2) /* ARRAY_INFO(0, arg2, 0) */
477    ZEND_ARG_INFO(0, callback_data_compare_func)
478ZEND_END_ARG_INFO()
479
480ZEND_BEGIN_ARG_INFO_EX(arginfo_array_intersect_assoc, 0, 0, 2)
481    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
482    ZEND_ARG_VARIADIC_INFO(0, arrays)
483ZEND_END_ARG_INFO()
484
485ZEND_BEGIN_ARG_INFO(arginfo_array_uintersect_assoc, 0)
486    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
487    ZEND_ARG_INFO(0, arr2) /* ARRAY_INFO(0, arg2, 0) */
488    ZEND_ARG_INFO(0, callback_data_compare_func)
489ZEND_END_ARG_INFO()
490
491ZEND_BEGIN_ARG_INFO(arginfo_array_intersect_uassoc, 0)
492    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
493    ZEND_ARG_INFO(0, arr2) /* ARRAY_INFO(0, arg2, 0) */
494    ZEND_ARG_INFO(0, callback_key_compare_func)
495ZEND_END_ARG_INFO()
496
497ZEND_BEGIN_ARG_INFO(arginfo_array_uintersect_uassoc, 0)
498    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
499    ZEND_ARG_INFO(0, arr2) /* ARRAY_INFO(0, arg2, 0) */
500    ZEND_ARG_INFO(0, callback_data_compare_func)
501    ZEND_ARG_INFO(0, callback_key_compare_func)
502ZEND_END_ARG_INFO()
503
504ZEND_BEGIN_ARG_INFO_EX(arginfo_array_diff_key, 0, 0, 2)
505    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
506    ZEND_ARG_VARIADIC_INFO(0, arrays)
507ZEND_END_ARG_INFO()
508
509ZEND_BEGIN_ARG_INFO(arginfo_array_diff_ukey, 0)
510    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
511    ZEND_ARG_INFO(0, arr2) /* ARRAY_INFO(0, arg2, 0) */
512    ZEND_ARG_INFO(0, callback_key_comp_func)
513ZEND_END_ARG_INFO()
514
515ZEND_BEGIN_ARG_INFO_EX(arginfo_array_diff, 0, 0, 2)
516    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
517    ZEND_ARG_VARIADIC_INFO(0, arrays)
518ZEND_END_ARG_INFO()
519
520ZEND_BEGIN_ARG_INFO(arginfo_array_udiff, 0)
521    ZEND_ARG_INFO(0, arr1)
522    ZEND_ARG_INFO(0, arr2)
523    ZEND_ARG_INFO(0, callback_data_comp_func)
524ZEND_END_ARG_INFO()
525
526ZEND_BEGIN_ARG_INFO_EX(arginfo_array_diff_assoc, 0, 0, 2)
527    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
528    ZEND_ARG_VARIADIC_INFO(0, arrays)
529ZEND_END_ARG_INFO()
530
531ZEND_BEGIN_ARG_INFO(arginfo_array_diff_uassoc, 0)
532    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
533    ZEND_ARG_INFO(0, arr2) /* ARRAY_INFO(0, arg2, 0) */
534    ZEND_ARG_INFO(0, callback_data_comp_func)
535ZEND_END_ARG_INFO()
536
537ZEND_BEGIN_ARG_INFO(arginfo_array_udiff_assoc, 0)
538    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
539    ZEND_ARG_INFO(0, arr2) /* ARRAY_INFO(0, arg2, 0) */
540    ZEND_ARG_INFO(0, callback_key_comp_func)
541ZEND_END_ARG_INFO()
542
543ZEND_BEGIN_ARG_INFO(arginfo_array_udiff_uassoc, 0)
544    ZEND_ARG_INFO(0, arr1) /* ARRAY_INFO(0, arg1, 0) */
545    ZEND_ARG_INFO(0, arr2) /* ARRAY_INFO(0, arg2, 0) */
546    ZEND_ARG_INFO(0, callback_data_comp_func)
547    ZEND_ARG_INFO(0, callback_key_comp_func)
548ZEND_END_ARG_INFO()
549
550ZEND_BEGIN_ARG_INFO_EX(arginfo_array_multisort, 0, 0, 1)
551    ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, arr1) /* ARRAY_INFO(0, arg1, 0) */
552    ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, sort_order)
553    ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, sort_flags)
554    ZEND_ARG_VARIADIC_INFO(ZEND_SEND_PREFER_REF, arr2)
555ZEND_END_ARG_INFO()
556
557ZEND_BEGIN_ARG_INFO_EX(arginfo_array_rand, 0, 0, 1)
558    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
559    ZEND_ARG_INFO(0, num_req)
560ZEND_END_ARG_INFO()
561
562ZEND_BEGIN_ARG_INFO(arginfo_array_sum, 0)
563    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
564ZEND_END_ARG_INFO()
565
566ZEND_BEGIN_ARG_INFO(arginfo_array_product, 0)
567    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
568ZEND_END_ARG_INFO()
569
570ZEND_BEGIN_ARG_INFO_EX(arginfo_array_reduce, 0, 0, 2)
571    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
572    ZEND_ARG_INFO(0, callback)
573    ZEND_ARG_INFO(0, initial)
574ZEND_END_ARG_INFO()
575
576ZEND_BEGIN_ARG_INFO_EX(arginfo_array_filter, 0, 0, 1)
577    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
578    ZEND_ARG_INFO(0, callback)
579    ZEND_ARG_INFO(0, use_keys)
580ZEND_END_ARG_INFO()
581
582ZEND_BEGIN_ARG_INFO_EX(arginfo_array_map, 0, 0, 2)
583    ZEND_ARG_INFO(0, callback)
584    ZEND_ARG_VARIADIC_INFO(0, arrays)
585ZEND_END_ARG_INFO()
586
587ZEND_BEGIN_ARG_INFO(arginfo_array_key_exists, 0)
588    ZEND_ARG_INFO(0, key)
589    ZEND_ARG_INFO(0, search)
590ZEND_END_ARG_INFO()
591
592ZEND_BEGIN_ARG_INFO_EX(arginfo_array_chunk, 0, 0, 2)
593    ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */
594    ZEND_ARG_INFO(0, size)
595    ZEND_ARG_INFO(0, preserve_keys)
596ZEND_END_ARG_INFO()
597
598ZEND_BEGIN_ARG_INFO(arginfo_array_combine, 0)
599    ZEND_ARG_INFO(0, keys)   /* ARRAY_INFO(0, keys, 0) */
600    ZEND_ARG_INFO(0, values) /* ARRAY_INFO(0, values, 0) */
601ZEND_END_ARG_INFO()
602/* }}} */
603/* {{{ basic_functions.c */
604ZEND_BEGIN_ARG_INFO(arginfo_get_magic_quotes_gpc, 0)
605ZEND_END_ARG_INFO()
606
607ZEND_BEGIN_ARG_INFO(arginfo_get_magic_quotes_runtime, 0)
608ZEND_END_ARG_INFO()
609
610ZEND_BEGIN_ARG_INFO_EX(arginfo_set_magic_quotes_runtime, 0, 0, 1)
611    ZEND_ARG_INFO(0, new_setting)
612ZEND_END_ARG_INFO()
613
614ZEND_BEGIN_ARG_INFO(arginfo_constant, 0)
615    ZEND_ARG_INFO(0, const_name)
616ZEND_END_ARG_INFO()
617
618#ifdef HAVE_INET_NTOP
619ZEND_BEGIN_ARG_INFO(arginfo_inet_ntop, 0)
620    ZEND_ARG_INFO(0, in_addr)
621ZEND_END_ARG_INFO()
622#endif
623
624#ifdef HAVE_INET_PTON
625ZEND_BEGIN_ARG_INFO(arginfo_inet_pton, 0)
626    ZEND_ARG_INFO(0, ip_address)
627ZEND_END_ARG_INFO()
628#endif
629
630ZEND_BEGIN_ARG_INFO(arginfo_ip2long, 0)
631    ZEND_ARG_INFO(0, ip_address)
632ZEND_END_ARG_INFO()
633
634ZEND_BEGIN_ARG_INFO(arginfo_long2ip, 0)
635    ZEND_ARG_INFO(0, proper_address)
636ZEND_END_ARG_INFO()
637
638ZEND_BEGIN_ARG_INFO(arginfo_getenv, 0)
639    ZEND_ARG_INFO(0, varname)
640ZEND_END_ARG_INFO()
641
642#ifdef HAVE_PUTENV
643ZEND_BEGIN_ARG_INFO(arginfo_putenv, 0)
644    ZEND_ARG_INFO(0, setting)
645ZEND_END_ARG_INFO()
646#endif
647
648ZEND_BEGIN_ARG_INFO_EX(arginfo_getopt, 0, 0, 1)
649    ZEND_ARG_INFO(0, options)
650    ZEND_ARG_INFO(0, opts) /* ARRAY_INFO(0, opts, 1) */
651ZEND_END_ARG_INFO()
652
653ZEND_BEGIN_ARG_INFO(arginfo_flush, 0)
654ZEND_END_ARG_INFO()
655
656ZEND_BEGIN_ARG_INFO(arginfo_sleep, 0)
657    ZEND_ARG_INFO(0, seconds)
658ZEND_END_ARG_INFO()
659
660ZEND_BEGIN_ARG_INFO(arginfo_usleep, 0)
661    ZEND_ARG_INFO(0, micro_seconds)
662ZEND_END_ARG_INFO()
663
664#if HAVE_NANOSLEEP
665ZEND_BEGIN_ARG_INFO(arginfo_time_nanosleep, 0)
666    ZEND_ARG_INFO(0, seconds)
667    ZEND_ARG_INFO(0, nanoseconds)
668ZEND_END_ARG_INFO()
669
670ZEND_BEGIN_ARG_INFO(arginfo_time_sleep_until, 0)
671    ZEND_ARG_INFO(0, timestamp)
672ZEND_END_ARG_INFO()
673#endif
674
675ZEND_BEGIN_ARG_INFO(arginfo_get_current_user, 0)
676ZEND_END_ARG_INFO()
677
678ZEND_BEGIN_ARG_INFO(arginfo_get_cfg_var, 0)
679    ZEND_ARG_INFO(0, option_name)
680ZEND_END_ARG_INFO()
681
682ZEND_BEGIN_ARG_INFO_EX(arginfo_error_log, 0, 0, 1)
683    ZEND_ARG_INFO(0, message)
684    ZEND_ARG_INFO(0, message_type)
685    ZEND_ARG_INFO(0, destination)
686    ZEND_ARG_INFO(0, extra_headers)
687ZEND_END_ARG_INFO()
688
689ZEND_BEGIN_ARG_INFO_EX(arginfo_error_get_last, 0, 0, 0)
690ZEND_END_ARG_INFO()
691
692ZEND_BEGIN_ARG_INFO_EX(arginfo_call_user_func, 0, 0, 1)
693    ZEND_ARG_INFO(0, function_name)
694    ZEND_ARG_VARIADIC_INFO(0, parameters)
695ZEND_END_ARG_INFO()
696
697ZEND_BEGIN_ARG_INFO_EX(arginfo_call_user_func_array, 0, 0, 2)
698    ZEND_ARG_INFO(0, function_name)
699    ZEND_ARG_INFO(0, parameters) /* ARRAY_INFO(0, parameters, 1) */
700ZEND_END_ARG_INFO()
701
702ZEND_BEGIN_ARG_INFO_EX(arginfo_call_user_method, 0, 0, 2)
703    ZEND_ARG_INFO(0, method_name)
704    ZEND_ARG_INFO(1, object)
705    ZEND_ARG_VARIADIC_INFO(0, parameters)
706ZEND_END_ARG_INFO()
707
708ZEND_BEGIN_ARG_INFO(arginfo_call_user_method_array, 0)
709    ZEND_ARG_INFO(0, method_name)
710    ZEND_ARG_INFO(1, object)
711    ZEND_ARG_INFO(0, params) /* ARRAY_INFO(0, params, 1) */
712ZEND_END_ARG_INFO()
713
714ZEND_BEGIN_ARG_INFO_EX(arginfo_forward_static_call, 0, 0, 1)
715    ZEND_ARG_INFO(0, function_name)
716    ZEND_ARG_VARIADIC_INFO(0, parameters)
717ZEND_END_ARG_INFO()
718
719ZEND_BEGIN_ARG_INFO_EX(arginfo_forward_static_call_array, 0, 0, 2)
720    ZEND_ARG_INFO(0, function_name)
721    ZEND_ARG_INFO(0, parameters) /* ARRAY_INFO(0, parameters, 1) */
722ZEND_END_ARG_INFO()
723
724ZEND_BEGIN_ARG_INFO_EX(arginfo_register_shutdown_function, 0, 0, 1)
725    ZEND_ARG_INFO(0, function_name)
726    ZEND_ARG_VARIADIC_INFO(0, parameters)
727ZEND_END_ARG_INFO()
728
729ZEND_BEGIN_ARG_INFO_EX(arginfo_highlight_file, 0, 0, 1)
730    ZEND_ARG_INFO(0, file_name)
731    ZEND_ARG_INFO(0, return)
732ZEND_END_ARG_INFO()
733
734ZEND_BEGIN_ARG_INFO(arginfo_php_strip_whitespace, 0)
735    ZEND_ARG_INFO(0, file_name)
736ZEND_END_ARG_INFO()
737
738ZEND_BEGIN_ARG_INFO_EX(arginfo_highlight_string, 0, 0, 1)
739    ZEND_ARG_INFO(0, string)
740    ZEND_ARG_INFO(0, return)
741ZEND_END_ARG_INFO()
742
743ZEND_BEGIN_ARG_INFO(arginfo_ini_get, 0)
744    ZEND_ARG_INFO(0, varname)
745ZEND_END_ARG_INFO()
746
747ZEND_BEGIN_ARG_INFO_EX(arginfo_ini_get_all, 0, 0, 0)
748    ZEND_ARG_INFO(0, extension)
749ZEND_END_ARG_INFO()
750
751ZEND_BEGIN_ARG_INFO(arginfo_ini_set, 0)
752    ZEND_ARG_INFO(0, varname)
753    ZEND_ARG_INFO(0, newvalue)
754ZEND_END_ARG_INFO()
755
756ZEND_BEGIN_ARG_INFO(arginfo_ini_restore, 0)
757    ZEND_ARG_INFO(0, varname)
758ZEND_END_ARG_INFO()
759
760ZEND_BEGIN_ARG_INFO(arginfo_set_include_path, 0)
761    ZEND_ARG_INFO(0, new_include_path)
762ZEND_END_ARG_INFO()
763
764ZEND_BEGIN_ARG_INFO(arginfo_get_include_path, 0)
765ZEND_END_ARG_INFO()
766
767ZEND_BEGIN_ARG_INFO(arginfo_restore_include_path, 0)
768ZEND_END_ARG_INFO()
769
770ZEND_BEGIN_ARG_INFO_EX(arginfo_print_r, 0, 0, 1)
771    ZEND_ARG_INFO(0, var)
772    ZEND_ARG_INFO(0, return)
773ZEND_END_ARG_INFO()
774
775ZEND_BEGIN_ARG_INFO(arginfo_connection_aborted, 0)
776ZEND_END_ARG_INFO()
777
778ZEND_BEGIN_ARG_INFO(arginfo_connection_status, 0)
779ZEND_END_ARG_INFO()
780
781ZEND_BEGIN_ARG_INFO_EX(arginfo_ignore_user_abort, 0, 0, 0)
782    ZEND_ARG_INFO(0, value)
783ZEND_END_ARG_INFO()
784
785#if HAVE_GETSERVBYNAME
786ZEND_BEGIN_ARG_INFO(arginfo_getservbyname, 0)
787    ZEND_ARG_INFO(0, service)
788    ZEND_ARG_INFO(0, protocol)
789ZEND_END_ARG_INFO()
790#endif
791
792#if HAVE_GETSERVBYPORT
793ZEND_BEGIN_ARG_INFO(arginfo_getservbyport, 0)
794    ZEND_ARG_INFO(0, port)
795    ZEND_ARG_INFO(0, protocol)
796ZEND_END_ARG_INFO()
797#endif
798
799#if HAVE_GETPROTOBYNAME
800ZEND_BEGIN_ARG_INFO(arginfo_getprotobyname, 0)
801    ZEND_ARG_INFO(0, name)
802ZEND_END_ARG_INFO()
803#endif
804
805#if HAVE_GETPROTOBYNUMBER
806ZEND_BEGIN_ARG_INFO(arginfo_getprotobynumber, 0)
807    ZEND_ARG_INFO(0, proto)
808ZEND_END_ARG_INFO()
809#endif
810
811ZEND_BEGIN_ARG_INFO_EX(arginfo_register_tick_function, 0, 0, 1)
812    ZEND_ARG_INFO(0, function_name)
813    ZEND_ARG_VARIADIC_INFO(0, parameters)
814ZEND_END_ARG_INFO()
815
816ZEND_BEGIN_ARG_INFO(arginfo_unregister_tick_function, 0)
817    ZEND_ARG_INFO(0, function_name)
818ZEND_END_ARG_INFO()
819
820ZEND_BEGIN_ARG_INFO(arginfo_is_uploaded_file, 0)
821    ZEND_ARG_INFO(0, path)
822ZEND_END_ARG_INFO()
823
824ZEND_BEGIN_ARG_INFO(arginfo_move_uploaded_file, 0)
825    ZEND_ARG_INFO(0, path)
826    ZEND_ARG_INFO(0, new_path)
827ZEND_END_ARG_INFO()
828
829ZEND_BEGIN_ARG_INFO_EX(arginfo_parse_ini_file, 0, 0, 1)
830    ZEND_ARG_INFO(0, filename)
831    ZEND_ARG_INFO(0, process_sections)
832    ZEND_ARG_INFO(0, scanner_mode)
833ZEND_END_ARG_INFO()
834
835ZEND_BEGIN_ARG_INFO_EX(arginfo_parse_ini_string, 0, 0, 1)
836    ZEND_ARG_INFO(0, ini_string)
837    ZEND_ARG_INFO(0, process_sections)
838    ZEND_ARG_INFO(0, scanner_mode)
839ZEND_END_ARG_INFO()
840
841#if ZEND_DEBUG
842ZEND_BEGIN_ARG_INFO(arginfo_config_get_hash, 0)
843ZEND_END_ARG_INFO()
844#endif
845
846#ifdef HAVE_GETLOADAVG
847ZEND_BEGIN_ARG_INFO(arginfo_sys_getloadavg, 0)
848ZEND_END_ARG_INFO()
849#endif
850/* }}} */
851/* {{{ assert.c */
852ZEND_BEGIN_ARG_INFO(arginfo_assert, 0)
853    ZEND_ARG_INFO(0, assertion)
854ZEND_END_ARG_INFO()
855
856ZEND_BEGIN_ARG_INFO_EX(arginfo_assert_options, 0, 0, 1)
857    ZEND_ARG_INFO(0, what)
858    ZEND_ARG_INFO(0, value)
859ZEND_END_ARG_INFO()
860/* }}} */
861/* {{{ base64.c */
862ZEND_BEGIN_ARG_INFO(arginfo_base64_encode, 0)
863    ZEND_ARG_INFO(0, str)
864ZEND_END_ARG_INFO()
865
866ZEND_BEGIN_ARG_INFO_EX(arginfo_base64_decode, 0, 0, 1)
867    ZEND_ARG_INFO(0, str)
868    ZEND_ARG_INFO(0, strict)
869ZEND_END_ARG_INFO()
870
871/* }}} */
872/* {{{ browscap.c */
873ZEND_BEGIN_ARG_INFO_EX(arginfo_get_browser, 0, 0, 0)
874    ZEND_ARG_INFO(0, browser_name)
875    ZEND_ARG_INFO(0, return_array)
876ZEND_END_ARG_INFO()
877/* }}} */
878/* {{{ crc32.c */
879ZEND_BEGIN_ARG_INFO(arginfo_crc32, 0)
880    ZEND_ARG_INFO(0, str)
881ZEND_END_ARG_INFO()
882
883/* }}} */
884/* {{{ crypt.c */
885#if HAVE_CRYPT
886ZEND_BEGIN_ARG_INFO_EX(arginfo_crypt, 0, 0, 1)
887    ZEND_ARG_INFO(0, str)
888    ZEND_ARG_INFO(0, salt)
889ZEND_END_ARG_INFO()
890#endif
891/* }}} */
892/* {{{ cyr_convert.c */
893ZEND_BEGIN_ARG_INFO(arginfo_convert_cyr_string, 0)
894    ZEND_ARG_INFO(0, str)
895    ZEND_ARG_INFO(0, from)
896    ZEND_ARG_INFO(0, to)
897ZEND_END_ARG_INFO()
898
899/* }}} */
900/* {{{ datetime.c */
901#if HAVE_STRPTIME
902ZEND_BEGIN_ARG_INFO(arginfo_strptime, 0)
903    ZEND_ARG_INFO(0, timestamp)
904    ZEND_ARG_INFO(0, format)
905ZEND_END_ARG_INFO()
906#endif
907/* }}} */
908/* {{{ dir.c */
909ZEND_BEGIN_ARG_INFO_EX(arginfo_opendir, 0, 0, 1)
910    ZEND_ARG_INFO(0, path)
911    ZEND_ARG_INFO(0, context)
912ZEND_END_ARG_INFO()
913
914ZEND_BEGIN_ARG_INFO_EX(arginfo_dir, 0, 0, 1)
915    ZEND_ARG_INFO(0, directory)
916    ZEND_ARG_INFO(0, context)
917ZEND_END_ARG_INFO()
918
919ZEND_BEGIN_ARG_INFO_EX(arginfo_closedir, 0, 0, 0)
920    ZEND_ARG_INFO(0, dir_handle)
921ZEND_END_ARG_INFO()
922
923#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC
924ZEND_BEGIN_ARG_INFO(arginfo_chroot, 0)
925    ZEND_ARG_INFO(0, directory)
926ZEND_END_ARG_INFO()
927#endif
928
929ZEND_BEGIN_ARG_INFO(arginfo_chdir, 0)
930    ZEND_ARG_INFO(0, directory)
931ZEND_END_ARG_INFO()
932
933ZEND_BEGIN_ARG_INFO(arginfo_getcwd, 0)
934ZEND_END_ARG_INFO()
935
936ZEND_BEGIN_ARG_INFO_EX(arginfo_rewinddir, 0, 0, 0)
937    ZEND_ARG_INFO(0, dir_handle)
938ZEND_END_ARG_INFO()
939
940ZEND_BEGIN_ARG_INFO_EX(arginfo_readdir, 0, 0, 0)
941    ZEND_ARG_INFO(0, dir_handle)
942ZEND_END_ARG_INFO()
943
944#ifdef HAVE_GLOB
945ZEND_BEGIN_ARG_INFO_EX(arginfo_glob, 0, 0, 1)
946    ZEND_ARG_INFO(0, pattern)
947    ZEND_ARG_INFO(0, flags)
948ZEND_END_ARG_INFO()
949#endif
950
951ZEND_BEGIN_ARG_INFO_EX(arginfo_scandir, 0, 0, 1)
952    ZEND_ARG_INFO(0, dir)
953    ZEND_ARG_INFO(0, sorting_order)
954    ZEND_ARG_INFO(0, context)
955ZEND_END_ARG_INFO()
956/* }}} */
957/* {{{ dns.c */
958ZEND_BEGIN_ARG_INFO(arginfo_gethostbyaddr, 0)
959    ZEND_ARG_INFO(0, ip_address)
960ZEND_END_ARG_INFO()
961
962ZEND_BEGIN_ARG_INFO(arginfo_gethostbyname, 0)
963    ZEND_ARG_INFO(0, hostname)
964ZEND_END_ARG_INFO()
965
966ZEND_BEGIN_ARG_INFO(arginfo_gethostbynamel, 0)
967    ZEND_ARG_INFO(0, hostname)
968ZEND_END_ARG_INFO()
969
970#ifdef HAVE_GETHOSTNAME
971ZEND_BEGIN_ARG_INFO(arginfo_gethostname, 0)
972ZEND_END_ARG_INFO()
973#endif
974
975#if defined(PHP_WIN32) || (HAVE_DNS_SEARCH_FUNC && !(defined(__BEOS__) || defined(NETWARE)))
976ZEND_BEGIN_ARG_INFO_EX(arginfo_dns_check_record, 0, 0, 1)
977    ZEND_ARG_INFO(0, host)
978    ZEND_ARG_INFO(0, type)
979ZEND_END_ARG_INFO()
980
981# if defined(PHP_WIN32) || HAVE_FULL_DNS_FUNCS
982ZEND_BEGIN_ARG_INFO_EX(arginfo_dns_get_record, 0, 0, 1)
983    ZEND_ARG_INFO(0, hostname)
984    ZEND_ARG_INFO(0, type)
985    ZEND_ARG_ARRAY_INFO(1, authns, 1)
986    ZEND_ARG_ARRAY_INFO(1, addtl, 1)
987    ZEND_ARG_INFO(0, raw)
988ZEND_END_ARG_INFO()
989
990ZEND_BEGIN_ARG_INFO_EX(arginfo_dns_get_mx, 0, 0, 2)
991    ZEND_ARG_INFO(0, hostname)
992    ZEND_ARG_INFO(1, mxhosts) /* ARRAY_INFO(1, mxhosts, 1) */
993    ZEND_ARG_INFO(1, weight) /* ARRAY_INFO(1, weight, 1) */
994ZEND_END_ARG_INFO()
995# endif
996
997#endif /* defined(PHP_WIN32) || (HAVE_DNS_SEARCH_FUNC && !(defined(__BEOS__) || defined(NETWARE))) */
998/* }}} */
999
1000/* {{{ exec.c */
1001ZEND_BEGIN_ARG_INFO_EX(arginfo_exec, 0, 0, 1)
1002    ZEND_ARG_INFO(0, command)
1003    ZEND_ARG_INFO(1, output) /* ARRAY_INFO(1, output, 1) */
1004    ZEND_ARG_INFO(1, return_value)
1005ZEND_END_ARG_INFO()
1006
1007ZEND_BEGIN_ARG_INFO_EX(arginfo_system, 0, 0, 1)
1008    ZEND_ARG_INFO(0, command)
1009    ZEND_ARG_INFO(1, return_value)
1010ZEND_END_ARG_INFO()
1011
1012ZEND_BEGIN_ARG_INFO_EX(arginfo_passthru, 0, 0, 1)
1013    ZEND_ARG_INFO(0, command)
1014    ZEND_ARG_INFO(1, return_value)
1015ZEND_END_ARG_INFO()
1016
1017ZEND_BEGIN_ARG_INFO(arginfo_escapeshellcmd, 0)
1018    ZEND_ARG_INFO(0, command)
1019ZEND_END_ARG_INFO()
1020
1021ZEND_BEGIN_ARG_INFO(arginfo_escapeshellarg, 0)
1022    ZEND_ARG_INFO(0, arg)
1023ZEND_END_ARG_INFO()
1024
1025ZEND_BEGIN_ARG_INFO(arginfo_shell_exec, 0)
1026    ZEND_ARG_INFO(0, cmd)
1027ZEND_END_ARG_INFO()
1028
1029#ifdef HAVE_NICE
1030ZEND_BEGIN_ARG_INFO(arginfo_proc_nice, 0)
1031    ZEND_ARG_INFO(0, priority)
1032ZEND_END_ARG_INFO()
1033#endif
1034/* }}} */
1035/* {{{ file.c */
1036ZEND_BEGIN_ARG_INFO_EX(arginfo_flock, 0, 0, 2)
1037    ZEND_ARG_INFO(0, fp)
1038    ZEND_ARG_INFO(0, operation)
1039    ZEND_ARG_INFO(1, wouldblock)
1040ZEND_END_ARG_INFO()
1041
1042ZEND_BEGIN_ARG_INFO_EX(arginfo_get_meta_tags, 0, 0, 1)
1043    ZEND_ARG_INFO(0, filename)
1044    ZEND_ARG_INFO(0, use_include_path)
1045ZEND_END_ARG_INFO()
1046
1047ZEND_BEGIN_ARG_INFO_EX(arginfo_file_get_contents, 0, 0, 1)
1048    ZEND_ARG_INFO(0, filename)
1049    ZEND_ARG_INFO(0, flags)
1050    ZEND_ARG_INFO(0, context)
1051    ZEND_ARG_INFO(0, offset)
1052    ZEND_ARG_INFO(0, maxlen)
1053ZEND_END_ARG_INFO()
1054
1055ZEND_BEGIN_ARG_INFO_EX(arginfo_file_put_contents, 0, 0, 2)
1056    ZEND_ARG_INFO(0, filename)
1057    ZEND_ARG_INFO(0, data)
1058    ZEND_ARG_INFO(0, flags)
1059    ZEND_ARG_INFO(0, context)
1060ZEND_END_ARG_INFO()
1061
1062ZEND_BEGIN_ARG_INFO_EX(arginfo_file, 0, 0, 1)
1063    ZEND_ARG_INFO(0, filename)
1064    ZEND_ARG_INFO(0, flags)
1065    ZEND_ARG_INFO(0, context)
1066ZEND_END_ARG_INFO()
1067
1068ZEND_BEGIN_ARG_INFO(arginfo_tempnam, 0)
1069    ZEND_ARG_INFO(0, dir)
1070    ZEND_ARG_INFO(0, prefix)
1071ZEND_END_ARG_INFO()
1072
1073ZEND_BEGIN_ARG_INFO(arginfo_tmpfile, 0)
1074ZEND_END_ARG_INFO()
1075
1076ZEND_BEGIN_ARG_INFO_EX(arginfo_fopen, 0, 0, 2)
1077    ZEND_ARG_INFO(0, filename)
1078    ZEND_ARG_INFO(0, mode)
1079    ZEND_ARG_INFO(0, use_include_path)
1080    ZEND_ARG_INFO(0, context)
1081ZEND_END_ARG_INFO()
1082
1083ZEND_BEGIN_ARG_INFO(arginfo_fclose, 0)
1084    ZEND_ARG_INFO(0, fp)
1085ZEND_END_ARG_INFO()
1086
1087ZEND_BEGIN_ARG_INFO(arginfo_popen, 0)
1088    ZEND_ARG_INFO(0, command)
1089    ZEND_ARG_INFO(0, mode)
1090ZEND_END_ARG_INFO()
1091
1092ZEND_BEGIN_ARG_INFO(arginfo_pclose, 0)
1093    ZEND_ARG_INFO(0, fp)
1094ZEND_END_ARG_INFO()
1095
1096ZEND_BEGIN_ARG_INFO(arginfo_feof, 0)
1097    ZEND_ARG_INFO(0, fp)
1098ZEND_END_ARG_INFO()
1099
1100ZEND_BEGIN_ARG_INFO_EX(arginfo_fgets, 0, 0, 1)
1101    ZEND_ARG_INFO(0, fp)
1102    ZEND_ARG_INFO(0, length)
1103ZEND_END_ARG_INFO()
1104
1105ZEND_BEGIN_ARG_INFO(arginfo_fgetc, 0)
1106    ZEND_ARG_INFO(0, fp)
1107ZEND_END_ARG_INFO()
1108
1109ZEND_BEGIN_ARG_INFO_EX(arginfo_fgetss, 0, 0, 1)
1110    ZEND_ARG_INFO(0, fp)
1111    ZEND_ARG_INFO(0, length)
1112    ZEND_ARG_INFO(0, allowable_tags)
1113ZEND_END_ARG_INFO()
1114
1115ZEND_BEGIN_ARG_INFO_EX(arginfo_fscanf, 0, 0, 2)
1116    ZEND_ARG_INFO(0, stream)
1117    ZEND_ARG_INFO(0, format)
1118    ZEND_ARG_VARIADIC_INFO(1, vars)
1119ZEND_END_ARG_INFO()
1120
1121ZEND_BEGIN_ARG_INFO_EX(arginfo_fwrite, 0, 0, 2)
1122    ZEND_ARG_INFO(0, fp)
1123    ZEND_ARG_INFO(0, str)
1124    ZEND_ARG_INFO(0, length)
1125ZEND_END_ARG_INFO()
1126
1127ZEND_BEGIN_ARG_INFO(arginfo_fflush, 0)
1128    ZEND_ARG_INFO(0, fp)
1129ZEND_END_ARG_INFO()
1130
1131ZEND_BEGIN_ARG_INFO(arginfo_rewind, 0)
1132    ZEND_ARG_INFO(0, fp)
1133ZEND_END_ARG_INFO()
1134
1135ZEND_BEGIN_ARG_INFO(arginfo_ftell, 0)
1136    ZEND_ARG_INFO(0, fp)
1137ZEND_END_ARG_INFO()
1138
1139ZEND_BEGIN_ARG_INFO_EX(arginfo_fseek, 0, 0, 2)
1140    ZEND_ARG_INFO(0, fp)
1141    ZEND_ARG_INFO(0, offset)
1142    ZEND_ARG_INFO(0, whence)
1143ZEND_END_ARG_INFO()
1144
1145ZEND_BEGIN_ARG_INFO_EX(arginfo_mkdir, 0, 0, 1)
1146    ZEND_ARG_INFO(0, pathname)
1147    ZEND_ARG_INFO(0, mode)
1148    ZEND_ARG_INFO(0, recursive)
1149    ZEND_ARG_INFO(0, context)
1150ZEND_END_ARG_INFO()
1151
1152ZEND_BEGIN_ARG_INFO_EX(arginfo_rmdir, 0, 0, 1)
1153    ZEND_ARG_INFO(0, dirname)
1154    ZEND_ARG_INFO(0, context)
1155ZEND_END_ARG_INFO()
1156
1157ZEND_BEGIN_ARG_INFO_EX(arginfo_readfile, 0, 0, 1)
1158    ZEND_ARG_INFO(0, filename)
1159    ZEND_ARG_INFO(0, flags)
1160    ZEND_ARG_INFO(0, context)
1161ZEND_END_ARG_INFO()
1162
1163ZEND_BEGIN_ARG_INFO_EX(arginfo_umask, 0, 0, 0)
1164    ZEND_ARG_INFO(0, mask)
1165ZEND_END_ARG_INFO()
1166
1167ZEND_BEGIN_ARG_INFO(arginfo_fpassthru, 0)
1168    ZEND_ARG_INFO(0, fp)
1169ZEND_END_ARG_INFO()
1170
1171ZEND_BEGIN_ARG_INFO_EX(arginfo_rename, 0, 0, 2)
1172    ZEND_ARG_INFO(0, old_name)
1173    ZEND_ARG_INFO(0, new_name)
1174    ZEND_ARG_INFO(0, context)
1175ZEND_END_ARG_INFO()
1176
1177ZEND_BEGIN_ARG_INFO_EX(arginfo_unlink, 0, 0, 1)
1178    ZEND_ARG_INFO(0, filename)
1179    ZEND_ARG_INFO(0, context)
1180ZEND_END_ARG_INFO()
1181
1182ZEND_BEGIN_ARG_INFO(arginfo_ftruncate, 0)
1183    ZEND_ARG_INFO(0, fp)
1184    ZEND_ARG_INFO(0, size)
1185ZEND_END_ARG_INFO()
1186
1187ZEND_BEGIN_ARG_INFO(arginfo_fstat, 0)
1188    ZEND_ARG_INFO(0, fp)
1189ZEND_END_ARG_INFO()
1190ZEND_BEGIN_ARG_INFO_EX(arginfo_copy, 0, 0, 2)
1191    ZEND_ARG_INFO(0, source_file)
1192    ZEND_ARG_INFO(0, destination_file)
1193    ZEND_ARG_INFO(0, context)
1194ZEND_END_ARG_INFO()
1195
1196ZEND_BEGIN_ARG_INFO(arginfo_fread, 0)
1197    ZEND_ARG_INFO(0, fp)
1198    ZEND_ARG_INFO(0, length)
1199ZEND_END_ARG_INFO()
1200
1201ZEND_BEGIN_ARG_INFO_EX(arginfo_fputcsv, 0, 0, 2)
1202    ZEND_ARG_INFO(0, fp)
1203    ZEND_ARG_INFO(0, fields) /* ARRAY_INFO(0, fields, 1) */
1204    ZEND_ARG_INFO(0, delimiter)
1205    ZEND_ARG_INFO(0, enclosure)
1206ZEND_END_ARG_INFO()
1207
1208ZEND_BEGIN_ARG_INFO_EX(arginfo_fgetcsv, 0, 0, 1)
1209    ZEND_ARG_INFO(0, fp)
1210    ZEND_ARG_INFO(0, length)
1211    ZEND_ARG_INFO(0, delimiter)
1212    ZEND_ARG_INFO(0, enclosure)
1213    ZEND_ARG_INFO(0, escape)
1214ZEND_END_ARG_INFO()
1215
1216#if (!defined(__BEOS__) && !defined(NETWARE) && HAVE_REALPATH) || defined(ZTS)
1217ZEND_BEGIN_ARG_INFO(arginfo_realpath, 0)
1218    ZEND_ARG_INFO(0, path)
1219ZEND_END_ARG_INFO()
1220#endif
1221
1222#ifdef HAVE_FNMATCH
1223ZEND_BEGIN_ARG_INFO_EX(arginfo_fnmatch, 0, 0, 2)
1224    ZEND_ARG_INFO(0, pattern)
1225    ZEND_ARG_INFO(0, filename)
1226    ZEND_ARG_INFO(0, flags)
1227ZEND_END_ARG_INFO()
1228#endif
1229
1230ZEND_BEGIN_ARG_INFO(arginfo_sys_get_temp_dir, 0)
1231ZEND_END_ARG_INFO()
1232/* }}} */
1233/* {{{ filestat.c */
1234ZEND_BEGIN_ARG_INFO(arginfo_disk_total_space, 0)
1235    ZEND_ARG_INFO(0, path)
1236ZEND_END_ARG_INFO()
1237
1238ZEND_BEGIN_ARG_INFO(arginfo_disk_free_space, 0)
1239    ZEND_ARG_INFO(0, path)
1240ZEND_END_ARG_INFO()
1241
1242#ifndef NETWARE
1243ZEND_BEGIN_ARG_INFO(arginfo_chgrp, 0)
1244    ZEND_ARG_INFO(0, filename)
1245    ZEND_ARG_INFO(0, group)
1246ZEND_END_ARG_INFO()
1247
1248ZEND_BEGIN_ARG_INFO(arginfo_chown, 0)
1249    ZEND_ARG_INFO(0, filename)
1250    ZEND_ARG_INFO(0, user)
1251ZEND_END_ARG_INFO()
1252#endif
1253
1254#if HAVE_LCHOWN
1255ZEND_BEGIN_ARG_INFO(arginfo_lchgrp, 0)
1256    ZEND_ARG_INFO(0, filename)
1257    ZEND_ARG_INFO(0, group)
1258ZEND_END_ARG_INFO()
1259
1260ZEND_BEGIN_ARG_INFO(arginfo_lchown, 0)
1261    ZEND_ARG_INFO(0, filename)
1262    ZEND_ARG_INFO(0, user)
1263ZEND_END_ARG_INFO()
1264#endif
1265
1266ZEND_BEGIN_ARG_INFO(arginfo_chmod, 0)
1267    ZEND_ARG_INFO(0, filename)
1268    ZEND_ARG_INFO(0, mode)
1269ZEND_END_ARG_INFO()
1270
1271#if HAVE_UTIME
1272ZEND_BEGIN_ARG_INFO_EX(arginfo_touch, 0, 0, 1)
1273    ZEND_ARG_INFO(0, filename)
1274    ZEND_ARG_INFO(0, time)
1275    ZEND_ARG_INFO(0, atime)
1276ZEND_END_ARG_INFO()
1277#endif
1278
1279ZEND_BEGIN_ARG_INFO_EX(arginfo_clearstatcache, 0, 0, 0)
1280    ZEND_ARG_INFO(0, clear_realpath_cache)
1281    ZEND_ARG_INFO(0, filename)
1282ZEND_END_ARG_INFO()
1283
1284ZEND_BEGIN_ARG_INFO(arginfo_realpath_cache_size, 0)
1285ZEND_END_ARG_INFO()
1286
1287ZEND_BEGIN_ARG_INFO(arginfo_realpath_cache_get, 0)
1288ZEND_END_ARG_INFO()
1289
1290ZEND_BEGIN_ARG_INFO(arginfo_fileperms, 0)
1291    ZEND_ARG_INFO(0, filename)
1292ZEND_END_ARG_INFO()
1293
1294ZEND_BEGIN_ARG_INFO(arginfo_fileinode, 0)
1295    ZEND_ARG_INFO(0, filename)
1296ZEND_END_ARG_INFO()
1297
1298ZEND_BEGIN_ARG_INFO(arginfo_filesize, 0)
1299    ZEND_ARG_INFO(0, filename)
1300ZEND_END_ARG_INFO()
1301
1302ZEND_BEGIN_ARG_INFO(arginfo_fileowner, 0)
1303    ZEND_ARG_INFO(0, filename)
1304ZEND_END_ARG_INFO()
1305
1306ZEND_BEGIN_ARG_INFO(arginfo_filegroup, 0)
1307    ZEND_ARG_INFO(0, filename)
1308ZEND_END_ARG_INFO()
1309
1310ZEND_BEGIN_ARG_INFO(arginfo_fileatime, 0)
1311    ZEND_ARG_INFO(0, filename)
1312ZEND_END_ARG_INFO()
1313
1314ZEND_BEGIN_ARG_INFO(arginfo_filemtime, 0)
1315    ZEND_ARG_INFO(0, filename)
1316ZEND_END_ARG_INFO()
1317
1318ZEND_BEGIN_ARG_INFO(arginfo_filectime, 0)
1319    ZEND_ARG_INFO(0, filename)
1320ZEND_END_ARG_INFO()
1321
1322ZEND_BEGIN_ARG_INFO(arginfo_filetype, 0)
1323    ZEND_ARG_INFO(0, filename)
1324ZEND_END_ARG_INFO()
1325
1326ZEND_BEGIN_ARG_INFO(arginfo_is_writable, 0)
1327    ZEND_ARG_INFO(0, filename)
1328ZEND_END_ARG_INFO()
1329
1330ZEND_BEGIN_ARG_INFO(arginfo_is_readable, 0)
1331    ZEND_ARG_INFO(0, filename)
1332ZEND_END_ARG_INFO()
1333
1334ZEND_BEGIN_ARG_INFO(arginfo_is_executable, 0)
1335    ZEND_ARG_INFO(0, filename)
1336ZEND_END_ARG_INFO()
1337
1338ZEND_BEGIN_ARG_INFO(arginfo_is_file, 0)
1339    ZEND_ARG_INFO(0, filename)
1340ZEND_END_ARG_INFO()
1341
1342ZEND_BEGIN_ARG_INFO(arginfo_is_dir, 0)
1343    ZEND_ARG_INFO(0, filename)
1344ZEND_END_ARG_INFO()
1345
1346ZEND_BEGIN_ARG_INFO(arginfo_is_link, 0)
1347    ZEND_ARG_INFO(0, filename)
1348ZEND_END_ARG_INFO()
1349
1350ZEND_BEGIN_ARG_INFO(arginfo_file_exists, 0)
1351    ZEND_ARG_INFO(0, filename)
1352ZEND_END_ARG_INFO()
1353
1354ZEND_BEGIN_ARG_INFO(arginfo_lstat, 0)
1355    ZEND_ARG_INFO(0, filename)
1356ZEND_END_ARG_INFO()
1357
1358ZEND_BEGIN_ARG_INFO(arginfo_stat, 0)
1359    ZEND_ARG_INFO(0, filename)
1360ZEND_END_ARG_INFO()
1361/* }}} */
1362/* {{{ formatted_print.c */
1363ZEND_BEGIN_ARG_INFO_EX(arginfo_sprintf, 0, 0, 2)
1364    ZEND_ARG_INFO(0, format)
1365    ZEND_ARG_VARIADIC_INFO(0, args)
1366ZEND_END_ARG_INFO()
1367
1368ZEND_BEGIN_ARG_INFO(arginfo_vsprintf, 0)
1369    ZEND_ARG_INFO(0, format)
1370    ZEND_ARG_INFO(0, args) /* ARRAY_INFO(0, args, 1) */
1371ZEND_END_ARG_INFO()
1372
1373ZEND_BEGIN_ARG_INFO_EX(arginfo_printf, 0, 0, 1)
1374    ZEND_ARG_INFO(0, format)
1375    ZEND_ARG_VARIADIC_INFO(0, args)
1376ZEND_END_ARG_INFO()
1377
1378ZEND_BEGIN_ARG_INFO(arginfo_vprintf, 0)
1379    ZEND_ARG_INFO(0, format)
1380    ZEND_ARG_INFO(0, args) /* ARRAY_INFO(0, args, 1) */
1381ZEND_END_ARG_INFO()
1382
1383ZEND_BEGIN_ARG_INFO_EX(arginfo_fprintf, 0, 0, 2)
1384    ZEND_ARG_INFO(0, stream)
1385    ZEND_ARG_INFO(0, format)
1386    ZEND_ARG_VARIADIC_INFO(0, args)
1387ZEND_END_ARG_INFO()
1388
1389ZEND_BEGIN_ARG_INFO(arginfo_vfprintf, 0)
1390    ZEND_ARG_INFO(0, stream)
1391    ZEND_ARG_INFO(0, format)
1392    ZEND_ARG_INFO(0, args) /* ARRAY_INFO(0, args, 1) */
1393ZEND_END_ARG_INFO()
1394/* }}} */
1395/* {{{ fsock.c */
1396ZEND_BEGIN_ARG_INFO_EX(arginfo_fsockopen, 0, 0, 2)
1397    ZEND_ARG_INFO(0, hostname)
1398    ZEND_ARG_INFO(0, port)
1399    ZEND_ARG_INFO(1, errno)
1400    ZEND_ARG_INFO(1, errstr)
1401    ZEND_ARG_INFO(0, timeout)
1402ZEND_END_ARG_INFO()
1403
1404ZEND_BEGIN_ARG_INFO_EX(arginfo_pfsockopen, 0, 0, 2)
1405    ZEND_ARG_INFO(0, hostname)
1406    ZEND_ARG_INFO(0, port)
1407    ZEND_ARG_INFO(1, errno)
1408    ZEND_ARG_INFO(1, errstr)
1409    ZEND_ARG_INFO(0, timeout)
1410ZEND_END_ARG_INFO()
1411/* }}} */
1412/* {{{ ftok.c */
1413#if HAVE_FTOK
1414ZEND_BEGIN_ARG_INFO(arginfo_ftok, 0)
1415    ZEND_ARG_INFO(0, pathname)
1416    ZEND_ARG_INFO(0, proj)
1417ZEND_END_ARG_INFO()
1418#endif
1419/* }}} */
1420/* {{{ head.c */
1421ZEND_BEGIN_ARG_INFO_EX(arginfo_header, 0, 0, 1)
1422    ZEND_ARG_INFO(0, header)
1423    ZEND_ARG_INFO(0, replace)
1424    ZEND_ARG_INFO(0, http_response_code)
1425ZEND_END_ARG_INFO()
1426
1427ZEND_BEGIN_ARG_INFO_EX(arginfo_header_remove, 0, 0, 0)
1428    ZEND_ARG_INFO(0, name)
1429ZEND_END_ARG_INFO()
1430
1431ZEND_BEGIN_ARG_INFO_EX(arginfo_setcookie, 0, 0, 1)
1432    ZEND_ARG_INFO(0, name)
1433    ZEND_ARG_INFO(0, value)
1434    ZEND_ARG_INFO(0, expires)
1435    ZEND_ARG_INFO(0, path)
1436    ZEND_ARG_INFO(0, domain)
1437    ZEND_ARG_INFO(0, secure)
1438ZEND_END_ARG_INFO()
1439
1440ZEND_BEGIN_ARG_INFO_EX(arginfo_setrawcookie, 0, 0, 1)
1441    ZEND_ARG_INFO(0, name)
1442    ZEND_ARG_INFO(0, value)
1443    ZEND_ARG_INFO(0, expires)
1444    ZEND_ARG_INFO(0, path)
1445    ZEND_ARG_INFO(0, domain)
1446    ZEND_ARG_INFO(0, secure)
1447ZEND_END_ARG_INFO()
1448
1449ZEND_BEGIN_ARG_INFO_EX(arginfo_headers_sent, 0, 0, 0)
1450    ZEND_ARG_INFO(1, file)
1451    ZEND_ARG_INFO(1, line)
1452ZEND_END_ARG_INFO()
1453
1454ZEND_BEGIN_ARG_INFO(arginfo_headers_list, 0)
1455ZEND_END_ARG_INFO()
1456
1457ZEND_BEGIN_ARG_INFO_EX(arginfo_http_response_code, 0, 0, 0)
1458    ZEND_ARG_INFO(0, response_code)
1459ZEND_END_ARG_INFO()
1460/* }}} */
1461/* {{{ html.c */
1462ZEND_BEGIN_ARG_INFO_EX(arginfo_htmlspecialchars, 0, 0, 1)
1463    ZEND_ARG_INFO(0, string)
1464    ZEND_ARG_INFO(0, quote_style)
1465    ZEND_ARG_INFO(0, charset)
1466    ZEND_ARG_INFO(0, double_encode)
1467ZEND_END_ARG_INFO()
1468
1469ZEND_BEGIN_ARG_INFO_EX(arginfo_htmlspecialchars_decode, 0, 0, 1)
1470    ZEND_ARG_INFO(0, string)
1471    ZEND_ARG_INFO(0, quote_style)
1472ZEND_END_ARG_INFO()
1473
1474ZEND_BEGIN_ARG_INFO_EX(arginfo_html_entity_decode, 0, 0, 1)
1475    ZEND_ARG_INFO(0, string)
1476    ZEND_ARG_INFO(0, quote_style)
1477    ZEND_ARG_INFO(0, charset)
1478ZEND_END_ARG_INFO()
1479
1480ZEND_BEGIN_ARG_INFO_EX(arginfo_htmlentities, 0, 0, 1)
1481    ZEND_ARG_INFO(0, string)
1482    ZEND_ARG_INFO(0, quote_style)
1483    ZEND_ARG_INFO(0, charset)
1484    ZEND_ARG_INFO(0, double_encode)
1485ZEND_END_ARG_INFO()
1486
1487ZEND_BEGIN_ARG_INFO_EX(arginfo_get_html_translation_table, 0, 0, 0)
1488    ZEND_ARG_INFO(0, table)
1489    ZEND_ARG_INFO(0, quote_style)
1490ZEND_END_ARG_INFO()
1491
1492/* }}} */
1493/* {{{ http.c */
1494ZEND_BEGIN_ARG_INFO_EX(arginfo_http_build_query, 0, 0, 1)
1495    ZEND_ARG_INFO(0, formdata)
1496    ZEND_ARG_INFO(0, prefix)
1497    ZEND_ARG_INFO(0, arg_separator)
1498    ZEND_ARG_INFO(0, enc_type)
1499ZEND_END_ARG_INFO()
1500/* }}} */
1501/* {{{ image.c */
1502ZEND_BEGIN_ARG_INFO(arginfo_image_type_to_mime_type, 0)
1503    ZEND_ARG_INFO(0, imagetype)
1504ZEND_END_ARG_INFO()
1505
1506ZEND_BEGIN_ARG_INFO_EX(arginfo_image_type_to_extension, 0, 0, 1)
1507    ZEND_ARG_INFO(0, imagetype)
1508    ZEND_ARG_INFO(0, include_dot)
1509ZEND_END_ARG_INFO()
1510
1511ZEND_BEGIN_ARG_INFO_EX(arginfo_getimagesize, 0, 0, 1)
1512    ZEND_ARG_INFO(0, imagefile)
1513    ZEND_ARG_INFO(1, info) /* ARRAY_INFO(1, info, 1) */
1514ZEND_END_ARG_INFO()
1515/* }}} */
1516/* {{{ info.c */
1517ZEND_BEGIN_ARG_INFO_EX(arginfo_phpinfo, 0, 0, 0)
1518    ZEND_ARG_INFO(0, what)
1519ZEND_END_ARG_INFO()
1520
1521ZEND_BEGIN_ARG_INFO_EX(arginfo_phpversion, 0, 0, 0)
1522    ZEND_ARG_INFO(0, extension)
1523ZEND_END_ARG_INFO()
1524
1525ZEND_BEGIN_ARG_INFO_EX(arginfo_phpcredits, 0, 0, 0)
1526    ZEND_ARG_INFO(0, flag)
1527ZEND_END_ARG_INFO()
1528
1529ZEND_BEGIN_ARG_INFO(arginfo_php_sapi_name, 0)
1530ZEND_END_ARG_INFO()
1531
1532ZEND_BEGIN_ARG_INFO(arginfo_php_uname, 0)
1533ZEND_END_ARG_INFO()
1534
1535ZEND_BEGIN_ARG_INFO(arginfo_php_ini_scanned_files, 0)
1536ZEND_END_ARG_INFO()
1537
1538ZEND_BEGIN_ARG_INFO(arginfo_php_ini_loaded_file, 0)
1539ZEND_END_ARG_INFO()
1540/* }}} */
1541/* {{{ iptc.c */
1542ZEND_BEGIN_ARG_INFO_EX(arginfo_iptcembed, 0, 0, 2)
1543    ZEND_ARG_INFO(0, iptcdata)
1544    ZEND_ARG_INFO(0, jpeg_file_name)
1545    ZEND_ARG_INFO(0, spool)
1546ZEND_END_ARG_INFO()
1547
1548ZEND_BEGIN_ARG_INFO(arginfo_iptcparse, 0)
1549    ZEND_ARG_INFO(0, iptcdata)
1550ZEND_END_ARG_INFO()
1551/* }}} */
1552/* {{{ lcg.c */
1553ZEND_BEGIN_ARG_INFO(arginfo_lcg_value, 0)
1554ZEND_END_ARG_INFO()
1555/* }}} */
1556/* {{{ levenshtein.c */
1557ZEND_BEGIN_ARG_INFO(arginfo_levenshtein, 0)
1558    ZEND_ARG_INFO(0, str1)
1559    ZEND_ARG_INFO(0, str2)
1560    ZEND_ARG_INFO(0, cost_ins)
1561    ZEND_ARG_INFO(0, cost_rep)
1562    ZEND_ARG_INFO(0, cost_del)
1563ZEND_END_ARG_INFO()
1564/* }}} */
1565/* {{{ link.c */
1566#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
1567ZEND_BEGIN_ARG_INFO(arginfo_readlink, 0)
1568    ZEND_ARG_INFO(0, filename)
1569ZEND_END_ARG_INFO()
1570
1571ZEND_BEGIN_ARG_INFO(arginfo_linkinfo, 0)
1572    ZEND_ARG_INFO(0, filename)
1573ZEND_END_ARG_INFO()
1574
1575ZEND_BEGIN_ARG_INFO(arginfo_symlink, 0)
1576    ZEND_ARG_INFO(0, target)
1577    ZEND_ARG_INFO(0, link)
1578ZEND_END_ARG_INFO()
1579
1580ZEND_BEGIN_ARG_INFO(arginfo_link, 0)
1581    ZEND_ARG_INFO(0, target)
1582    ZEND_ARG_INFO(0, link)
1583ZEND_END_ARG_INFO()
1584#endif
1585/* }}} */
1586/* {{{ mail.c */
1587ZEND_BEGIN_ARG_INFO(arginfo_ezmlm_hash, 0)
1588    ZEND_ARG_INFO(0, addr)
1589ZEND_END_ARG_INFO()
1590
1591ZEND_BEGIN_ARG_INFO_EX(arginfo_mail, 0, 0, 3)
1592    ZEND_ARG_INFO(0, to)
1593    ZEND_ARG_INFO(0, subject)
1594    ZEND_ARG_INFO(0, message)
1595    ZEND_ARG_INFO(0, additional_headers)
1596    ZEND_ARG_INFO(0, additional_parameters)
1597ZEND_END_ARG_INFO()
1598/* }}} */
1599/* {{{ math.c */
1600ZEND_BEGIN_ARG_INFO(arginfo_abs, 0)
1601    ZEND_ARG_INFO(0, number)
1602ZEND_END_ARG_INFO()
1603
1604ZEND_BEGIN_ARG_INFO(arginfo_ceil, 0)
1605    ZEND_ARG_INFO(0, number)
1606ZEND_END_ARG_INFO()
1607
1608ZEND_BEGIN_ARG_INFO(arginfo_floor, 0)
1609    ZEND_ARG_INFO(0, number)
1610ZEND_END_ARG_INFO()
1611
1612ZEND_BEGIN_ARG_INFO_EX(arginfo_round, 0, 0, 1)
1613    ZEND_ARG_INFO(0, number)
1614    ZEND_ARG_INFO(0, precision)
1615    ZEND_ARG_INFO(0, mode)
1616ZEND_END_ARG_INFO()
1617
1618ZEND_BEGIN_ARG_INFO(arginfo_sin, 0)
1619    ZEND_ARG_INFO(0, number)
1620ZEND_END_ARG_INFO()
1621
1622ZEND_BEGIN_ARG_INFO(arginfo_cos, 0)
1623    ZEND_ARG_INFO(0, number)
1624ZEND_END_ARG_INFO()
1625
1626ZEND_BEGIN_ARG_INFO(arginfo_tan, 0)
1627    ZEND_ARG_INFO(0, number)
1628ZEND_END_ARG_INFO()
1629
1630ZEND_BEGIN_ARG_INFO(arginfo_asin, 0)
1631    ZEND_ARG_INFO(0, number)
1632ZEND_END_ARG_INFO()
1633
1634ZEND_BEGIN_ARG_INFO(arginfo_acos, 0)
1635    ZEND_ARG_INFO(0, number)
1636ZEND_END_ARG_INFO()
1637
1638ZEND_BEGIN_ARG_INFO(arginfo_atan, 0)
1639    ZEND_ARG_INFO(0, number)
1640ZEND_END_ARG_INFO()
1641
1642ZEND_BEGIN_ARG_INFO(arginfo_atan2, 0)
1643    ZEND_ARG_INFO(0, y)
1644    ZEND_ARG_INFO(0, x)
1645ZEND_END_ARG_INFO()
1646
1647ZEND_BEGIN_ARG_INFO(arginfo_sinh, 0)
1648    ZEND_ARG_INFO(0, number)
1649ZEND_END_ARG_INFO()
1650
1651ZEND_BEGIN_ARG_INFO(arginfo_cosh, 0)
1652    ZEND_ARG_INFO(0, number)
1653ZEND_END_ARG_INFO()
1654
1655ZEND_BEGIN_ARG_INFO(arginfo_tanh, 0)
1656    ZEND_ARG_INFO(0, number)
1657ZEND_END_ARG_INFO()
1658
1659ZEND_BEGIN_ARG_INFO(arginfo_asinh, 0)
1660    ZEND_ARG_INFO(0, number)
1661ZEND_END_ARG_INFO()
1662
1663ZEND_BEGIN_ARG_INFO(arginfo_acosh, 0)
1664    ZEND_ARG_INFO(0, number)
1665ZEND_END_ARG_INFO()
1666
1667ZEND_BEGIN_ARG_INFO(arginfo_atanh, 0)
1668    ZEND_ARG_INFO(0, number)
1669ZEND_END_ARG_INFO()
1670
1671ZEND_BEGIN_ARG_INFO(arginfo_pi, 0)
1672ZEND_END_ARG_INFO()
1673
1674ZEND_BEGIN_ARG_INFO(arginfo_is_finite, 0)
1675    ZEND_ARG_INFO(0, val)
1676ZEND_END_ARG_INFO()
1677
1678ZEND_BEGIN_ARG_INFO(arginfo_is_infinite, 0)
1679    ZEND_ARG_INFO(0, val)
1680ZEND_END_ARG_INFO()
1681
1682ZEND_BEGIN_ARG_INFO(arginfo_is_nan, 0)
1683    ZEND_ARG_INFO(0, val)
1684ZEND_END_ARG_INFO()
1685
1686ZEND_BEGIN_ARG_INFO(arginfo_pow, 0)
1687    ZEND_ARG_INFO(0, base)
1688    ZEND_ARG_INFO(0, exponent)
1689ZEND_END_ARG_INFO()
1690
1691ZEND_BEGIN_ARG_INFO(arginfo_exp, 0)
1692    ZEND_ARG_INFO(0, number)
1693ZEND_END_ARG_INFO()
1694
1695ZEND_BEGIN_ARG_INFO(arginfo_expm1, 0)
1696    ZEND_ARG_INFO(0, number)
1697ZEND_END_ARG_INFO()
1698
1699ZEND_BEGIN_ARG_INFO(arginfo_log1p, 0)
1700    ZEND_ARG_INFO(0, number)
1701ZEND_END_ARG_INFO()
1702
1703ZEND_BEGIN_ARG_INFO_EX(arginfo_log, 0, 0, 1)
1704    ZEND_ARG_INFO(0, number)
1705    ZEND_ARG_INFO(0, base)
1706ZEND_END_ARG_INFO()
1707
1708ZEND_BEGIN_ARG_INFO(arginfo_log10, 0)
1709    ZEND_ARG_INFO(0, number)
1710ZEND_END_ARG_INFO()
1711
1712ZEND_BEGIN_ARG_INFO(arginfo_sqrt, 0)
1713    ZEND_ARG_INFO(0, number)
1714ZEND_END_ARG_INFO()
1715
1716ZEND_BEGIN_ARG_INFO(arginfo_hypot, 0)
1717    ZEND_ARG_INFO(0, num1)
1718    ZEND_ARG_INFO(0, num2)
1719ZEND_END_ARG_INFO()
1720
1721ZEND_BEGIN_ARG_INFO(arginfo_deg2rad, 0)
1722    ZEND_ARG_INFO(0, number)
1723ZEND_END_ARG_INFO()
1724
1725ZEND_BEGIN_ARG_INFO(arginfo_rad2deg, 0)
1726    ZEND_ARG_INFO(0, number)
1727ZEND_END_ARG_INFO()
1728
1729ZEND_BEGIN_ARG_INFO(arginfo_bindec, 0)
1730    ZEND_ARG_INFO(0, binary_number)
1731ZEND_END_ARG_INFO()
1732
1733ZEND_BEGIN_ARG_INFO(arginfo_hexdec, 0)
1734    ZEND_ARG_INFO(0, hexadecimal_number)
1735ZEND_END_ARG_INFO()
1736
1737ZEND_BEGIN_ARG_INFO(arginfo_octdec, 0)
1738    ZEND_ARG_INFO(0, octal_number)
1739ZEND_END_ARG_INFO()
1740
1741ZEND_BEGIN_ARG_INFO(arginfo_decbin, 0)
1742    ZEND_ARG_INFO(0, decimal_number)
1743ZEND_END_ARG_INFO()
1744
1745ZEND_BEGIN_ARG_INFO(arginfo_decoct, 0)
1746    ZEND_ARG_INFO(0, decimal_number)
1747ZEND_END_ARG_INFO()
1748
1749ZEND_BEGIN_ARG_INFO(arginfo_dechex, 0)
1750    ZEND_ARG_INFO(0, decimal_number)
1751ZEND_END_ARG_INFO()
1752
1753ZEND_BEGIN_ARG_INFO(arginfo_base_convert, 0)
1754    ZEND_ARG_INFO(0, number)
1755    ZEND_ARG_INFO(0, frombase)
1756    ZEND_ARG_INFO(0, tobase)
1757ZEND_END_ARG_INFO()
1758
1759ZEND_BEGIN_ARG_INFO_EX(arginfo_number_format, 0, 0, 1)
1760    ZEND_ARG_INFO(0, number)
1761    ZEND_ARG_INFO(0, num_decimal_places)
1762    ZEND_ARG_INFO(0, dec_separator)
1763    ZEND_ARG_INFO(0, thousands_separator)
1764ZEND_END_ARG_INFO()
1765
1766ZEND_BEGIN_ARG_INFO(arginfo_fmod, 0)
1767    ZEND_ARG_INFO(0, x)
1768    ZEND_ARG_INFO(0, y)
1769ZEND_END_ARG_INFO()
1770/* }}} */
1771/* {{{ md5.c */
1772ZEND_BEGIN_ARG_INFO_EX(arginfo_md5, 0, 0, 1)
1773    ZEND_ARG_INFO(0, str)
1774    ZEND_ARG_INFO(0, raw_output)
1775ZEND_END_ARG_INFO()
1776
1777ZEND_BEGIN_ARG_INFO_EX(arginfo_md5_file, 0, 0, 1)
1778    ZEND_ARG_INFO(0, filename)
1779    ZEND_ARG_INFO(0, raw_output)
1780ZEND_END_ARG_INFO()
1781/* }}} */
1782/* {{{ metaphone.c */
1783ZEND_BEGIN_ARG_INFO_EX(arginfo_metaphone, 0, 0, 1)
1784    ZEND_ARG_INFO(0, text)
1785    ZEND_ARG_INFO(0, phones)
1786ZEND_END_ARG_INFO()
1787/* }}} */
1788/* {{{ microtime.c */
1789#ifdef HAVE_GETTIMEOFDAY
1790ZEND_BEGIN_ARG_INFO_EX(arginfo_microtime, 0, 0, 0)
1791    ZEND_ARG_INFO(0, get_as_float)
1792ZEND_END_ARG_INFO()
1793
1794ZEND_BEGIN_ARG_INFO_EX(arginfo_gettimeofday, 0, 0, 0)
1795    ZEND_ARG_INFO(0, get_as_float)
1796ZEND_END_ARG_INFO()
1797#endif
1798
1799#ifdef HAVE_GETRUSAGE
1800ZEND_BEGIN_ARG_INFO_EX(arginfo_getrusage, 0, 0, 0)
1801    ZEND_ARG_INFO(0, who)
1802ZEND_END_ARG_INFO()
1803#endif
1804/* }}} */
1805/* {{{ pack.c */
1806ZEND_BEGIN_ARG_INFO_EX(arginfo_pack, 0, 0, 2)
1807    ZEND_ARG_INFO(0, format)
1808    ZEND_ARG_VARIADIC_INFO(0, args)
1809ZEND_END_ARG_INFO()
1810
1811ZEND_BEGIN_ARG_INFO(arginfo_unpack, 0)
1812    ZEND_ARG_INFO(0, format)
1813    ZEND_ARG_INFO(0, input)
1814ZEND_END_ARG_INFO()
1815/* }}} */
1816/* {{{ pageinfo.c */
1817ZEND_BEGIN_ARG_INFO(arginfo_getmyuid, 0)
1818ZEND_END_ARG_INFO()
1819
1820ZEND_BEGIN_ARG_INFO(arginfo_getmygid, 0)
1821ZEND_END_ARG_INFO()
1822
1823ZEND_BEGIN_ARG_INFO(arginfo_getmypid, 0)
1824ZEND_END_ARG_INFO()
1825
1826ZEND_BEGIN_ARG_INFO(arginfo_getmyinode, 0)
1827ZEND_END_ARG_INFO()
1828
1829ZEND_BEGIN_ARG_INFO(arginfo_getlastmod, 0)
1830ZEND_END_ARG_INFO()
1831/* }}} */
1832/* {{{ password.c */
1833ZEND_BEGIN_ARG_INFO_EX(arginfo_password_hash, 0, 0, 2)
1834    ZEND_ARG_INFO(0, password)
1835    ZEND_ARG_INFO(0, algo)
1836    ZEND_ARG_INFO(0, options)
1837ZEND_END_ARG_INFO()
1838ZEND_BEGIN_ARG_INFO_EX(arginfo_password_get_info, 0, 0, 1)
1839    ZEND_ARG_INFO(0, hash)
1840ZEND_END_ARG_INFO()
1841ZEND_BEGIN_ARG_INFO_EX(arginfo_password_needs_rehash, 0, 0, 2)
1842    ZEND_ARG_INFO(0, hash)
1843    ZEND_ARG_INFO(0, algo)
1844    ZEND_ARG_INFO(0, options)
1845ZEND_END_ARG_INFO()
1846ZEND_BEGIN_ARG_INFO_EX(arginfo_password_verify, 0, 0, 2)
1847    ZEND_ARG_INFO(0, password)
1848    ZEND_ARG_INFO(0, hash)
1849ZEND_END_ARG_INFO()
1850/* }}} */
1851/* {{{ proc_open.c */
1852#ifdef PHP_CAN_SUPPORT_PROC_OPEN
1853ZEND_BEGIN_ARG_INFO_EX(arginfo_proc_terminate, 0, 0, 1)
1854    ZEND_ARG_INFO(0, process)
1855    ZEND_ARG_INFO(0, signal)
1856ZEND_END_ARG_INFO()
1857
1858ZEND_BEGIN_ARG_INFO(arginfo_proc_close, 0)
1859    ZEND_ARG_INFO(0, process)
1860ZEND_END_ARG_INFO()
1861
1862ZEND_BEGIN_ARG_INFO(arginfo_proc_get_status, 0)
1863    ZEND_ARG_INFO(0, process)
1864ZEND_END_ARG_INFO()
1865
1866ZEND_BEGIN_ARG_INFO_EX(arginfo_proc_open, 0, 0, 3)
1867    ZEND_ARG_INFO(0, command)
1868    ZEND_ARG_INFO(0, descriptorspec) /* ARRAY_INFO(0, descriptorspec, 1) */
1869    ZEND_ARG_INFO(1, pipes) /* ARRAY_INFO(1, pipes, 1) */
1870    ZEND_ARG_INFO(0, cwd)
1871    ZEND_ARG_INFO(0, env) /* ARRAY_INFO(0, env, 1) */
1872    ZEND_ARG_INFO(0, other_options) /* ARRAY_INFO(0, other_options, 1) */
1873ZEND_END_ARG_INFO()
1874#endif
1875/* }}} */
1876/* {{{ quot_print.c */
1877ZEND_BEGIN_ARG_INFO(arginfo_quoted_printable_decode, 0)
1878    ZEND_ARG_INFO(0, str)
1879ZEND_END_ARG_INFO()
1880/* }}} */
1881/* {{{ quot_print.c */
1882ZEND_BEGIN_ARG_INFO(arginfo_quoted_printable_encode, 0)
1883    ZEND_ARG_INFO(0, str)
1884ZEND_END_ARG_INFO()
1885/* }}} */
1886/* {{{ rand.c */
1887ZEND_BEGIN_ARG_INFO_EX(arginfo_srand, 0, 0, 0)
1888    ZEND_ARG_INFO(0, seed)
1889ZEND_END_ARG_INFO()
1890
1891ZEND_BEGIN_ARG_INFO_EX(arginfo_mt_srand, 0, 0, 0)
1892    ZEND_ARG_INFO(0, seed)
1893ZEND_END_ARG_INFO()
1894
1895ZEND_BEGIN_ARG_INFO_EX(arginfo_rand, 0, 0, 0)
1896    ZEND_ARG_INFO(0, min)
1897    ZEND_ARG_INFO(0, max)
1898ZEND_END_ARG_INFO()
1899
1900ZEND_BEGIN_ARG_INFO_EX(arginfo_mt_rand, 0, 0, 0)
1901    ZEND_ARG_INFO(0, min)
1902    ZEND_ARG_INFO(0, max)
1903ZEND_END_ARG_INFO()
1904
1905ZEND_BEGIN_ARG_INFO(arginfo_getrandmax, 0)
1906ZEND_END_ARG_INFO()
1907
1908ZEND_BEGIN_ARG_INFO(arginfo_mt_getrandmax, 0)
1909ZEND_END_ARG_INFO()
1910/* }}} */
1911/* {{{ sha1.c */
1912ZEND_BEGIN_ARG_INFO_EX(arginfo_sha1, 0, 0, 1)
1913    ZEND_ARG_INFO(0, str)
1914    ZEND_ARG_INFO(0, raw_output)
1915ZEND_END_ARG_INFO()
1916
1917ZEND_BEGIN_ARG_INFO_EX(arginfo_sha1_file, 0, 0, 1)
1918    ZEND_ARG_INFO(0, filename)
1919    ZEND_ARG_INFO(0, raw_output)
1920ZEND_END_ARG_INFO()
1921/* }}} */
1922/* {{{ soundex.c */
1923ZEND_BEGIN_ARG_INFO(arginfo_soundex, 0)
1924    ZEND_ARG_INFO(0, str)
1925ZEND_END_ARG_INFO()
1926/* }}} */
1927/* {{{ streamsfuncs.c */
1928#if HAVE_SOCKETPAIR
1929ZEND_BEGIN_ARG_INFO(arginfo_stream_socket_pair, 0)
1930    ZEND_ARG_INFO(0, domain)
1931    ZEND_ARG_INFO(0, type)
1932    ZEND_ARG_INFO(0, protocol)
1933ZEND_END_ARG_INFO()
1934#endif
1935
1936ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_client, 0, 0, 1)
1937    ZEND_ARG_INFO(0, remoteaddress)
1938    ZEND_ARG_INFO(1, errcode)
1939    ZEND_ARG_INFO(1, errstring)
1940    ZEND_ARG_INFO(0, timeout)
1941    ZEND_ARG_INFO(0, flags)
1942    ZEND_ARG_INFO(0, context)
1943ZEND_END_ARG_INFO()
1944
1945ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_server, 0, 0, 1)
1946    ZEND_ARG_INFO(0, localaddress)
1947    ZEND_ARG_INFO(1, errcode)
1948    ZEND_ARG_INFO(1, errstring)
1949    ZEND_ARG_INFO(0, flags)
1950    ZEND_ARG_INFO(0, context)
1951ZEND_END_ARG_INFO()
1952
1953ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_accept, 0, 0, 1)
1954    ZEND_ARG_INFO(0, serverstream)
1955    ZEND_ARG_INFO(0, timeout)
1956    ZEND_ARG_INFO(1, peername)
1957ZEND_END_ARG_INFO()
1958
1959ZEND_BEGIN_ARG_INFO(arginfo_stream_socket_get_name, 0)
1960    ZEND_ARG_INFO(0, stream)
1961    ZEND_ARG_INFO(0, want_peer)
1962ZEND_END_ARG_INFO()
1963
1964ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_sendto, 0, 0, 2)
1965    ZEND_ARG_INFO(0, stream)
1966    ZEND_ARG_INFO(0, data)
1967    ZEND_ARG_INFO(0, flags)
1968    ZEND_ARG_INFO(0, target_addr)
1969ZEND_END_ARG_INFO()
1970
1971ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_recvfrom, 0, 0, 2)
1972    ZEND_ARG_INFO(0, stream)
1973    ZEND_ARG_INFO(0, amount)
1974    ZEND_ARG_INFO(0, flags)
1975    ZEND_ARG_INFO(1, remote_addr)
1976ZEND_END_ARG_INFO()
1977
1978ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_get_contents, 0, 0, 1)
1979    ZEND_ARG_INFO(0, source)
1980    ZEND_ARG_INFO(0, maxlen)
1981    ZEND_ARG_INFO(0, offset)
1982ZEND_END_ARG_INFO()
1983
1984ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_copy_to_stream, 0, 0, 2)
1985    ZEND_ARG_INFO(0, source)
1986    ZEND_ARG_INFO(0, dest)
1987    ZEND_ARG_INFO(0, maxlen)
1988    ZEND_ARG_INFO(0, pos)
1989ZEND_END_ARG_INFO()
1990
1991ZEND_BEGIN_ARG_INFO(arginfo_stream_get_meta_data, 0)
1992    ZEND_ARG_INFO(0, fp)
1993ZEND_END_ARG_INFO()
1994
1995ZEND_BEGIN_ARG_INFO(arginfo_stream_get_transports, 0)
1996ZEND_END_ARG_INFO()
1997
1998ZEND_BEGIN_ARG_INFO(arginfo_stream_get_wrappers, 0)
1999ZEND_END_ARG_INFO()
2000
2001ZEND_BEGIN_ARG_INFO(arginfo_stream_resolve_include_path, 0)
2002    ZEND_ARG_INFO(0, filename)
2003ZEND_END_ARG_INFO()
2004
2005ZEND_BEGIN_ARG_INFO(arginfo_stream_is_local, 0)
2006    ZEND_ARG_INFO(0, stream)
2007ZEND_END_ARG_INFO()
2008
2009ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_supports_lock, 0, 0, 1)
2010    ZEND_ARG_INFO(0, stream)
2011ZEND_END_ARG_INFO()
2012
2013ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_select, 0, 0, 4)
2014    ZEND_ARG_INFO(1, read_streams) /* ARRAY_INFO(1, read_streams, 1) */
2015    ZEND_ARG_INFO(1, write_streams) /* ARRAY_INFO(1, write_streams, 1) */
2016    ZEND_ARG_INFO(1, except_streams) /* ARRAY_INFO(1, except_streams, 1) */
2017    ZEND_ARG_INFO(0, tv_sec)
2018    ZEND_ARG_INFO(0, tv_usec)
2019ZEND_END_ARG_INFO()
2020
2021ZEND_BEGIN_ARG_INFO(arginfo_stream_context_get_options, 0)
2022    ZEND_ARG_INFO(0, stream_or_context)
2023ZEND_END_ARG_INFO()
2024
2025ZEND_BEGIN_ARG_INFO(arginfo_stream_context_set_option, 0)
2026    ZEND_ARG_INFO(0, stream_or_context)
2027    ZEND_ARG_INFO(0, wrappername)
2028    ZEND_ARG_INFO(0, optionname)
2029    ZEND_ARG_INFO(0, value)
2030ZEND_END_ARG_INFO()
2031
2032ZEND_BEGIN_ARG_INFO(arginfo_stream_context_set_params, 0)
2033    ZEND_ARG_INFO(0, stream_or_context)
2034    ZEND_ARG_INFO(0, options) /* ARRAY_INFO(0, options, 1) */
2035ZEND_END_ARG_INFO()
2036
2037ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_get_params, 0, ZEND_RETURN_VALUE, 1)
2038    ZEND_ARG_INFO(0, stream_or_context)
2039ZEND_END_ARG_INFO()
2040
2041ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_get_default, 0, 0, 0)
2042    ZEND_ARG_INFO(0, options) /* ARRAY_INFO(0, options, 1) */
2043ZEND_END_ARG_INFO()
2044
2045ZEND_BEGIN_ARG_INFO(arginfo_stream_context_set_default, 0)
2046    ZEND_ARG_INFO(0, options)
2047ZEND_END_ARG_INFO()
2048
2049ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_create, 0, 0, 0)
2050    ZEND_ARG_INFO(0, options) /* ARRAY_INFO(0, options, 1) */
2051    ZEND_ARG_INFO(0, params) /* ARRAY_INFO(0, params, 1) */
2052ZEND_END_ARG_INFO()
2053
2054ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_filter_prepend, 0, 0, 2)
2055    ZEND_ARG_INFO(0, stream)
2056    ZEND_ARG_INFO(0, filtername)
2057    ZEND_ARG_INFO(0, read_write)
2058    ZEND_ARG_INFO(0, filterparams)
2059ZEND_END_ARG_INFO()
2060
2061ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_filter_append, 0, 0, 2)
2062    ZEND_ARG_INFO(0, stream)
2063    ZEND_ARG_INFO(0, filtername)
2064    ZEND_ARG_INFO(0, read_write)
2065    ZEND_ARG_INFO(0, filterparams)
2066ZEND_END_ARG_INFO()
2067
2068ZEND_BEGIN_ARG_INFO(arginfo_stream_filter_remove, 0)
2069    ZEND_ARG_INFO(0, stream_filter)
2070ZEND_END_ARG_INFO()
2071
2072ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_get_line, 0, 0, 2)
2073    ZEND_ARG_INFO(0, stream)
2074    ZEND_ARG_INFO(0, maxlen)
2075    ZEND_ARG_INFO(0, ending)
2076ZEND_END_ARG_INFO()
2077
2078ZEND_BEGIN_ARG_INFO(arginfo_stream_set_blocking, 0)
2079    ZEND_ARG_INFO(0, socket)
2080    ZEND_ARG_INFO(0, mode)
2081ZEND_END_ARG_INFO()
2082
2083#if HAVE_SYS_TIME_H || defined(PHP_WIN32)
2084ZEND_BEGIN_ARG_INFO(arginfo_stream_set_timeout, 0)
2085    ZEND_ARG_INFO(0, stream)
2086    ZEND_ARG_INFO(0, seconds)
2087    ZEND_ARG_INFO(0, microseconds)
2088ZEND_END_ARG_INFO()
2089#endif
2090
2091ZEND_BEGIN_ARG_INFO(arginfo_stream_set_read_buffer, 0)
2092    ZEND_ARG_INFO(0, fp)
2093    ZEND_ARG_INFO(0, buffer)
2094ZEND_END_ARG_INFO()
2095
2096ZEND_BEGIN_ARG_INFO(arginfo_stream_set_write_buffer, 0)
2097    ZEND_ARG_INFO(0, fp)
2098    ZEND_ARG_INFO(0, buffer)
2099ZEND_END_ARG_INFO()
2100
2101ZEND_BEGIN_ARG_INFO(arginfo_stream_set_chunk_size, 0)
2102    ZEND_ARG_INFO(0, fp)
2103    ZEND_ARG_INFO(0, chunk_size)
2104ZEND_END_ARG_INFO()
2105
2106ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_enable_crypto, 0, 0, 2)
2107    ZEND_ARG_INFO(0, stream)
2108    ZEND_ARG_INFO(0, enable)
2109    ZEND_ARG_INFO(0, cryptokind)
2110    ZEND_ARG_INFO(0, sessionstream)
2111ZEND_END_ARG_INFO()
2112
2113#ifdef HAVE_SHUTDOWN
2114ZEND_BEGIN_ARG_INFO(arginfo_stream_socket_shutdown, 0)
2115    ZEND_ARG_INFO(0, stream)
2116    ZEND_ARG_INFO(0, how)
2117ZEND_END_ARG_INFO()
2118#endif
2119/* }}} */
2120/* {{{ string.c */
2121ZEND_BEGIN_ARG_INFO(arginfo_bin2hex, 0)
2122    ZEND_ARG_INFO(0, data)
2123ZEND_END_ARG_INFO()
2124
2125ZEND_BEGIN_ARG_INFO(arginfo_hex2bin, 0)
2126    ZEND_ARG_INFO(0, data)
2127ZEND_END_ARG_INFO()
2128
2129ZEND_BEGIN_ARG_INFO_EX(arginfo_strspn, 0, 0, 2)
2130    ZEND_ARG_INFO(0, str)
2131    ZEND_ARG_INFO(0, mask)
2132    ZEND_ARG_INFO(0, start)
2133    ZEND_ARG_INFO(0, len)
2134ZEND_END_ARG_INFO()
2135
2136ZEND_BEGIN_ARG_INFO_EX(arginfo_strcspn, 0, 0, 2)
2137    ZEND_ARG_INFO(0, str)
2138    ZEND_ARG_INFO(0, mask)
2139    ZEND_ARG_INFO(0, start)
2140    ZEND_ARG_INFO(0, len)
2141ZEND_END_ARG_INFO()
2142
2143#if HAVE_NL_LANGINFO
2144ZEND_BEGIN_ARG_INFO(arginfo_nl_langinfo, 0)
2145    ZEND_ARG_INFO(0, item)
2146ZEND_END_ARG_INFO()
2147#endif
2148
2149#ifdef HAVE_STRCOLL
2150ZEND_BEGIN_ARG_INFO(arginfo_strcoll, 0)
2151    ZEND_ARG_INFO(0, str1)
2152    ZEND_ARG_INFO(0, str2)
2153ZEND_END_ARG_INFO()
2154#endif
2155
2156ZEND_BEGIN_ARG_INFO_EX(arginfo_trim, 0, 0, 1)
2157    ZEND_ARG_INFO(0, str)
2158    ZEND_ARG_INFO(0, character_mask)
2159ZEND_END_ARG_INFO()
2160
2161ZEND_BEGIN_ARG_INFO_EX(arginfo_rtrim, 0, 0, 1)
2162    ZEND_ARG_INFO(0, str)
2163    ZEND_ARG_INFO(0, character_mask)
2164ZEND_END_ARG_INFO()
2165
2166ZEND_BEGIN_ARG_INFO_EX(arginfo_ltrim, 0, 0, 1)
2167    ZEND_ARG_INFO(0, str)
2168    ZEND_ARG_INFO(0, character_mask)
2169ZEND_END_ARG_INFO()
2170
2171ZEND_BEGIN_ARG_INFO_EX(arginfo_wordwrap, 0, 0, 1)
2172    ZEND_ARG_INFO(0, str)
2173    ZEND_ARG_INFO(0, width)
2174    ZEND_ARG_INFO(0, break)
2175    ZEND_ARG_INFO(0, cut)
2176ZEND_END_ARG_INFO()
2177
2178ZEND_BEGIN_ARG_INFO_EX(arginfo_explode, 0, 0, 2)
2179    ZEND_ARG_INFO(0, separator)
2180    ZEND_ARG_INFO(0, str)
2181    ZEND_ARG_INFO(0, limit)
2182ZEND_END_ARG_INFO()
2183
2184ZEND_BEGIN_ARG_INFO(arginfo_implode, 0)
2185    ZEND_ARG_INFO(0, glue)
2186    ZEND_ARG_INFO(0, pieces)
2187ZEND_END_ARG_INFO()
2188
2189ZEND_BEGIN_ARG_INFO(arginfo_strtok, 0)
2190    ZEND_ARG_INFO(0, str)
2191    ZEND_ARG_INFO(0, token)
2192ZEND_END_ARG_INFO()
2193
2194ZEND_BEGIN_ARG_INFO(arginfo_strtoupper, 0)
2195    ZEND_ARG_INFO(0, str)
2196ZEND_END_ARG_INFO()
2197
2198ZEND_BEGIN_ARG_INFO(arginfo_strtolower, 0)
2199    ZEND_ARG_INFO(0, str)
2200ZEND_END_ARG_INFO()
2201
2202ZEND_BEGIN_ARG_INFO_EX(arginfo_basename, 0, 0, 1)
2203    ZEND_ARG_INFO(0, path)
2204    ZEND_ARG_INFO(0, suffix)
2205ZEND_END_ARG_INFO()
2206
2207ZEND_BEGIN_ARG_INFO(arginfo_dirname, 0)
2208    ZEND_ARG_INFO(0, path)
2209ZEND_END_ARG_INFO()
2210
2211ZEND_BEGIN_ARG_INFO_EX(arginfo_pathinfo, 0, 0, 1)
2212    ZEND_ARG_INFO(0, path)
2213    ZEND_ARG_INFO(0, options)
2214ZEND_END_ARG_INFO()
2215
2216ZEND_BEGIN_ARG_INFO_EX(arginfo_stristr, 0, 0, 2)
2217    ZEND_ARG_INFO(0, haystack)
2218    ZEND_ARG_INFO(0, needle)
2219    ZEND_ARG_INFO(0, part)
2220ZEND_END_ARG_INFO()
2221
2222ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2)
2223    ZEND_ARG_INFO(0, haystack)
2224    ZEND_ARG_INFO(0, needle)
2225    ZEND_ARG_INFO(0, part)
2226ZEND_END_ARG_INFO()
2227
2228ZEND_BEGIN_ARG_INFO_EX(arginfo_strpos, 0, 0, 2)
2229    ZEND_ARG_INFO(0, haystack)
2230    ZEND_ARG_INFO(0, needle)
2231    ZEND_ARG_INFO(0, offset)
2232ZEND_END_ARG_INFO()
2233
2234ZEND_BEGIN_ARG_INFO_EX(arginfo_stripos, 0, 0, 2)
2235    ZEND_ARG_INFO(0, haystack)
2236    ZEND_ARG_INFO(0, needle)
2237    ZEND_ARG_INFO(0, offset)
2238ZEND_END_ARG_INFO()
2239
2240ZEND_BEGIN_ARG_INFO_EX(arginfo_strrpos, 0, 0, 2)
2241    ZEND_ARG_INFO(0, haystack)
2242    ZEND_ARG_INFO(0, needle)
2243    ZEND_ARG_INFO(0, offset)
2244ZEND_END_ARG_INFO()
2245
2246ZEND_BEGIN_ARG_INFO_EX(arginfo_strripos, 0, 0, 2)
2247    ZEND_ARG_INFO(0, haystack)
2248    ZEND_ARG_INFO(0, needle)
2249    ZEND_ARG_INFO(0, offset)
2250ZEND_END_ARG_INFO()
2251
2252ZEND_BEGIN_ARG_INFO(arginfo_strrchr, 0)
2253    ZEND_ARG_INFO(0, haystack)
2254    ZEND_ARG_INFO(0, needle)
2255ZEND_END_ARG_INFO()
2256
2257ZEND_BEGIN_ARG_INFO_EX(arginfo_chunk_split, 0, 0, 1)
2258    ZEND_ARG_INFO(0, str)
2259    ZEND_ARG_INFO(0, chunklen)
2260    ZEND_ARG_INFO(0, ending)
2261ZEND_END_ARG_INFO()
2262
2263ZEND_BEGIN_ARG_INFO_EX(arginfo_substr, 0, 0, 2)
2264    ZEND_ARG_INFO(0, str)
2265    ZEND_ARG_INFO(0, start)
2266    ZEND_ARG_INFO(0, length)
2267ZEND_END_ARG_INFO()
2268
2269ZEND_BEGIN_ARG_INFO_EX(arginfo_substr_replace, 0, 0, 3)
2270    ZEND_ARG_INFO(0, str)
2271    ZEND_ARG_INFO(0, replace)
2272    ZEND_ARG_INFO(0, start)
2273    ZEND_ARG_INFO(0, length)
2274ZEND_END_ARG_INFO()
2275
2276ZEND_BEGIN_ARG_INFO(arginfo_quotemeta, 0)
2277    ZEND_ARG_INFO(0, str)
2278ZEND_END_ARG_INFO()
2279
2280ZEND_BEGIN_ARG_INFO(arginfo_ord, 0)
2281    ZEND_ARG_INFO(0, character)
2282ZEND_END_ARG_INFO()
2283
2284ZEND_BEGIN_ARG_INFO(arginfo_chr, 0)
2285    ZEND_ARG_INFO(0, codepoint)
2286ZEND_END_ARG_INFO()
2287
2288ZEND_BEGIN_ARG_INFO(arginfo_ucfirst, 0)
2289    ZEND_ARG_INFO(0, str)
2290ZEND_END_ARG_INFO()
2291
2292ZEND_BEGIN_ARG_INFO(arginfo_lcfirst, 0)
2293    ZEND_ARG_INFO(0, str)
2294ZEND_END_ARG_INFO()
2295
2296ZEND_BEGIN_ARG_INFO_EX(arginfo_ucwords, 0, 0, 1)
2297    ZEND_ARG_INFO(0, str)
2298    ZEND_ARG_INFO(0, delimiters)
2299ZEND_END_ARG_INFO()
2300
2301ZEND_BEGIN_ARG_INFO_EX(arginfo_strtr, 0, 0, 2)
2302    ZEND_ARG_INFO(0, str)
2303    ZEND_ARG_INFO(0, from)
2304    ZEND_ARG_INFO(0, to)
2305ZEND_END_ARG_INFO()
2306
2307ZEND_BEGIN_ARG_INFO(arginfo_strrev, 0)
2308    ZEND_ARG_INFO(0, str)
2309ZEND_END_ARG_INFO()
2310
2311ZEND_BEGIN_ARG_INFO_EX(arginfo_similar_text, 0, 0, 2)
2312    ZEND_ARG_INFO(0, str1)
2313    ZEND_ARG_INFO(0, str2)
2314    ZEND_ARG_INFO(1, percent)
2315ZEND_END_ARG_INFO()
2316
2317ZEND_BEGIN_ARG_INFO(arginfo_addcslashes, 0)
2318    ZEND_ARG_INFO(0, str)
2319    ZEND_ARG_INFO(0, charlist)
2320ZEND_END_ARG_INFO()
2321
2322ZEND_BEGIN_ARG_INFO(arginfo_addslashes, 0)
2323    ZEND_ARG_INFO(0, str)
2324ZEND_END_ARG_INFO()
2325
2326ZEND_BEGIN_ARG_INFO(arginfo_stripcslashes, 0)
2327    ZEND_ARG_INFO(0, str)
2328ZEND_END_ARG_INFO()
2329
2330ZEND_BEGIN_ARG_INFO(arginfo_stripslashes, 0)
2331    ZEND_ARG_INFO(0, str)
2332ZEND_END_ARG_INFO()
2333
2334ZEND_BEGIN_ARG_INFO_EX(arginfo_str_replace, 0, 0, 3)
2335    ZEND_ARG_INFO(0, search)
2336    ZEND_ARG_INFO(0, replace)
2337    ZEND_ARG_INFO(0, subject)
2338    ZEND_ARG_INFO(1, replace_count)
2339ZEND_END_ARG_INFO()
2340
2341ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ireplace, 0, 0, 3)
2342    ZEND_ARG_INFO(0, search)
2343    ZEND_ARG_INFO(0, replace)
2344    ZEND_ARG_INFO(0, subject)
2345    ZEND_ARG_INFO(1, replace_count)
2346ZEND_END_ARG_INFO()
2347
2348ZEND_BEGIN_ARG_INFO_EX(arginfo_hebrev, 0, 0, 1)
2349    ZEND_ARG_INFO(0, str)
2350    ZEND_ARG_INFO(0, max_chars_per_line)
2351ZEND_END_ARG_INFO()
2352
2353ZEND_BEGIN_ARG_INFO_EX(arginfo_hebrevc, 0, 0, 1)
2354    ZEND_ARG_INFO(0, str)
2355    ZEND_ARG_INFO(0, max_chars_per_line)
2356ZEND_END_ARG_INFO()
2357
2358ZEND_BEGIN_ARG_INFO_EX(arginfo_nl2br, 0, 0, 1)
2359    ZEND_ARG_INFO(0, str)
2360    ZEND_ARG_INFO(0, is_xhtml)
2361ZEND_END_ARG_INFO()
2362
2363ZEND_BEGIN_ARG_INFO_EX(arginfo_strip_tags, 0, 0, 1)
2364    ZEND_ARG_INFO(0, str)
2365    ZEND_ARG_INFO(0, allowable_tags)
2366ZEND_END_ARG_INFO()
2367
2368ZEND_BEGIN_ARG_INFO_EX(arginfo_setlocale, 0, 0, 2)
2369    ZEND_ARG_INFO(0, category)
2370    ZEND_ARG_VARIADIC_INFO(0, locales)
2371ZEND_END_ARG_INFO()
2372
2373ZEND_BEGIN_ARG_INFO_EX(arginfo_parse_str, 0, 0, 1)
2374    ZEND_ARG_INFO(0, encoded_string)
2375    ZEND_ARG_INFO(1, result)
2376ZEND_END_ARG_INFO()
2377
2378ZEND_BEGIN_ARG_INFO_EX(arginfo_str_getcsv, 0, 0, 1)
2379    ZEND_ARG_INFO(0, string)
2380    ZEND_ARG_INFO(0, delimiter)
2381    ZEND_ARG_INFO(0, enclosure)
2382    ZEND_ARG_INFO(0, escape)
2383ZEND_END_ARG_INFO()
2384
2385ZEND_BEGIN_ARG_INFO(arginfo_str_repeat, 0)
2386    ZEND_ARG_INFO(0, input)
2387    ZEND_ARG_INFO(0, mult)
2388ZEND_END_ARG_INFO()
2389
2390ZEND_BEGIN_ARG_INFO_EX(arginfo_count_chars, 0, 0, 1)
2391    ZEND_ARG_INFO(0, input)
2392    ZEND_ARG_INFO(0, mode)
2393ZEND_END_ARG_INFO()
2394
2395ZEND_BEGIN_ARG_INFO(arginfo_strnatcmp, 0)
2396    ZEND_ARG_INFO(0, s1)
2397    ZEND_ARG_INFO(0, s2)
2398ZEND_END_ARG_INFO()
2399
2400ZEND_BEGIN_ARG_INFO(arginfo_localeconv, 0)
2401ZEND_END_ARG_INFO()
2402
2403ZEND_BEGIN_ARG_INFO(arginfo_strnatcasecmp, 0)
2404    ZEND_ARG_INFO(0, s1)
2405    ZEND_ARG_INFO(0, s2)
2406ZEND_END_ARG_INFO()
2407
2408ZEND_BEGIN_ARG_INFO_EX(arginfo_substr_count, 0, 0, 2)
2409    ZEND_ARG_INFO(0, haystack)
2410    ZEND_ARG_INFO(0, needle)
2411    ZEND_ARG_INFO(0, offset)
2412    ZEND_ARG_INFO(0, length)
2413ZEND_END_ARG_INFO()
2414
2415ZEND_BEGIN_ARG_INFO_EX(arginfo_str_pad, 0, 0, 2)
2416    ZEND_ARG_INFO(0, input)
2417    ZEND_ARG_INFO(0, pad_length)
2418    ZEND_ARG_INFO(0, pad_string)
2419    ZEND_ARG_INFO(0, pad_type)
2420ZEND_END_ARG_INFO()
2421
2422ZEND_BEGIN_ARG_INFO_EX(arginfo_sscanf, 0, 0, 2)
2423    ZEND_ARG_INFO(0, str)
2424    ZEND_ARG_INFO(0, format)
2425    ZEND_ARG_VARIADIC_INFO(1, vars)
2426ZEND_END_ARG_INFO()
2427
2428ZEND_BEGIN_ARG_INFO(arginfo_str_rot13, 0)
2429    ZEND_ARG_INFO(0, str)
2430ZEND_END_ARG_INFO()
2431
2432ZEND_BEGIN_ARG_INFO(arginfo_str_shuffle, 0)
2433    ZEND_ARG_INFO(0, str)
2434ZEND_END_ARG_INFO()
2435
2436ZEND_BEGIN_ARG_INFO_EX(arginfo_str_word_count, 0, 0, 1)
2437    ZEND_ARG_INFO(0, str)
2438    ZEND_ARG_INFO(0, format)
2439    ZEND_ARG_INFO(0, charlist)
2440ZEND_END_ARG_INFO()
2441
2442#ifdef HAVE_STRFMON
2443ZEND_BEGIN_ARG_INFO(arginfo_money_format, 0)
2444    ZEND_ARG_INFO(0, format)
2445    ZEND_ARG_INFO(0, value)
2446ZEND_END_ARG_INFO()
2447#endif
2448
2449ZEND_BEGIN_ARG_INFO_EX(arginfo_str_split, 0, 0, 1)
2450    ZEND_ARG_INFO(0, str)
2451    ZEND_ARG_INFO(0, split_length)
2452ZEND_END_ARG_INFO()
2453
2454ZEND_BEGIN_ARG_INFO_EX(arginfo_strpbrk, 0, 0, 1)
2455    ZEND_ARG_INFO(0, haystack)
2456    ZEND_ARG_INFO(0, char_list)
2457ZEND_END_ARG_INFO()
2458
2459ZEND_BEGIN_ARG_INFO_EX(arginfo_substr_compare, 0, 0, 3)
2460    ZEND_ARG_INFO(0, main_str)
2461    ZEND_ARG_INFO(0, str)
2462    ZEND_ARG_INFO(0, offset)
2463    ZEND_ARG_INFO(0, length)
2464    ZEND_ARG_INFO(0, case_sensitivity)
2465ZEND_END_ARG_INFO()
2466/* }}} */
2467/* {{{ syslog.c */
2468#ifdef HAVE_SYSLOG_H
2469ZEND_BEGIN_ARG_INFO(arginfo_openlog, 0)
2470    ZEND_ARG_INFO(0, ident)
2471    ZEND_ARG_INFO(0, option)
2472    ZEND_ARG_INFO(0, facility)
2473ZEND_END_ARG_INFO()
2474
2475ZEND_BEGIN_ARG_INFO(arginfo_closelog, 0)
2476ZEND_END_ARG_INFO()
2477
2478ZEND_BEGIN_ARG_INFO(arginfo_syslog, 0)
2479    ZEND_ARG_INFO(0, priority)
2480    ZEND_ARG_INFO(0, message)
2481ZEND_END_ARG_INFO()
2482#endif
2483/* }}} */
2484/* {{{ type.c */
2485ZEND_BEGIN_ARG_INFO(arginfo_gettype, 0)
2486    ZEND_ARG_INFO(0, var)
2487ZEND_END_ARG_INFO()
2488
2489ZEND_BEGIN_ARG_INFO(arginfo_settype, 0)
2490    ZEND_ARG_INFO(1, var)
2491    ZEND_ARG_INFO(0, type)
2492ZEND_END_ARG_INFO()
2493
2494ZEND_BEGIN_ARG_INFO_EX(arginfo_intval, 0, 0, 1)
2495    ZEND_ARG_INFO(0, var)
2496    ZEND_ARG_INFO(0, base)
2497ZEND_END_ARG_INFO()
2498
2499ZEND_BEGIN_ARG_INFO(arginfo_floatval, 0)
2500    ZEND_ARG_INFO(0, var)
2501ZEND_END_ARG_INFO()
2502
2503ZEND_BEGIN_ARG_INFO(arginfo_strval, 0)
2504    ZEND_ARG_INFO(0, var)
2505ZEND_END_ARG_INFO()
2506
2507ZEND_BEGIN_ARG_INFO(arginfo_boolval, 0)
2508    ZEND_ARG_INFO(0, var)
2509ZEND_END_ARG_INFO()
2510
2511ZEND_BEGIN_ARG_INFO(arginfo_is_null, 0)
2512    ZEND_ARG_INFO(0, var)
2513ZEND_END_ARG_INFO()
2514
2515ZEND_BEGIN_ARG_INFO(arginfo_is_resource, 0)
2516    ZEND_ARG_INFO(0, var)
2517ZEND_END_ARG_INFO()
2518
2519ZEND_BEGIN_ARG_INFO(arginfo_is_bool, 0)
2520    ZEND_ARG_INFO(0, var)
2521ZEND_END_ARG_INFO()
2522
2523ZEND_BEGIN_ARG_INFO(arginfo_is_long, 0)
2524    ZEND_ARG_INFO(0, var)
2525ZEND_END_ARG_INFO()
2526
2527ZEND_BEGIN_ARG_INFO(arginfo_is_float, 0)
2528    ZEND_ARG_INFO(0, var)
2529ZEND_END_ARG_INFO()
2530
2531ZEND_BEGIN_ARG_INFO(arginfo_is_string, 0)
2532    ZEND_ARG_INFO(0, var)
2533ZEND_END_ARG_INFO()
2534
2535ZEND_BEGIN_ARG_INFO(arginfo_is_array, 0)
2536    ZEND_ARG_INFO(0, var)
2537ZEND_END_ARG_INFO()
2538
2539ZEND_BEGIN_ARG_INFO(arginfo_is_object, 0)
2540    ZEND_ARG_INFO(0, var)
2541ZEND_END_ARG_INFO()
2542
2543ZEND_BEGIN_ARG_INFO(arginfo_is_numeric, 0)
2544    ZEND_ARG_INFO(0, value)
2545ZEND_END_ARG_INFO()
2546
2547ZEND_BEGIN_ARG_INFO(arginfo_is_scalar, 0)
2548    ZEND_ARG_INFO(0, value)
2549ZEND_END_ARG_INFO()
2550
2551ZEND_BEGIN_ARG_INFO_EX(arginfo_is_callable, 0, 0, 1)
2552    ZEND_ARG_INFO(0, var)
2553    ZEND_ARG_INFO(0, syntax_only)
2554    ZEND_ARG_INFO(1, callable_name)
2555ZEND_END_ARG_INFO()
2556/* }}} */
2557/* {{{ uniqid.c */
2558#ifdef HAVE_GETTIMEOFDAY
2559ZEND_BEGIN_ARG_INFO_EX(arginfo_uniqid, 0, 0, 0)
2560    ZEND_ARG_INFO(0, prefix)
2561    ZEND_ARG_INFO(0, more_entropy)
2562ZEND_END_ARG_INFO()
2563#endif
2564/* }}} */
2565/* {{{ url.c */
2566ZEND_BEGIN_ARG_INFO_EX(arginfo_parse_url, 0, 0, 1)
2567    ZEND_ARG_INFO(0, url)
2568    ZEND_ARG_INFO(0, component)
2569ZEND_END_ARG_INFO()
2570
2571ZEND_BEGIN_ARG_INFO(arginfo_urlencode, 0)
2572    ZEND_ARG_INFO(0, str)
2573ZEND_END_ARG_INFO()
2574
2575ZEND_BEGIN_ARG_INFO(arginfo_urldecode, 0)
2576    ZEND_ARG_INFO(0, str)
2577ZEND_END_ARG_INFO()
2578
2579ZEND_BEGIN_ARG_INFO(arginfo_rawurlencode, 0)
2580    ZEND_ARG_INFO(0, str)
2581ZEND_END_ARG_INFO()
2582
2583ZEND_BEGIN_ARG_INFO(arginfo_rawurldecode, 0)
2584    ZEND_ARG_INFO(0, str)
2585ZEND_END_ARG_INFO()
2586
2587ZEND_BEGIN_ARG_INFO_EX(arginfo_get_headers, 0, 0, 1)
2588    ZEND_ARG_INFO(0, url)
2589    ZEND_ARG_INFO(0, format)
2590ZEND_END_ARG_INFO()
2591/* }}} */
2592/* {{{ user_filters.c */
2593ZEND_BEGIN_ARG_INFO(arginfo_stream_bucket_make_writeable, 0)
2594    ZEND_ARG_INFO(0, brigade)
2595ZEND_END_ARG_INFO()
2596
2597ZEND_BEGIN_ARG_INFO(arginfo_stream_bucket_prepend, 0)
2598    ZEND_ARG_INFO(0, brigade)
2599    ZEND_ARG_INFO(0, bucket)
2600ZEND_END_ARG_INFO()
2601
2602ZEND_BEGIN_ARG_INFO(arginfo_stream_bucket_append, 0)
2603    ZEND_ARG_INFO(0, brigade)
2604    ZEND_ARG_INFO(0, bucket)
2605ZEND_END_ARG_INFO()
2606
2607ZEND_BEGIN_ARG_INFO(arginfo_stream_bucket_new, 0)
2608    ZEND_ARG_INFO(0, stream)
2609    ZEND_ARG_INFO(0, buffer)
2610ZEND_END_ARG_INFO()
2611
2612ZEND_BEGIN_ARG_INFO(arginfo_stream_get_filters, 0)
2613ZEND_END_ARG_INFO()
2614
2615ZEND_BEGIN_ARG_INFO(arginfo_stream_filter_register, 0)
2616    ZEND_ARG_INFO(0, filtername)
2617    ZEND_ARG_INFO(0, classname)
2618ZEND_END_ARG_INFO()
2619/* }}} */
2620/* {{{ uuencode.c */
2621ZEND_BEGIN_ARG_INFO(arginfo_convert_uuencode, 0)
2622    ZEND_ARG_INFO(0, data)
2623ZEND_END_ARG_INFO()
2624
2625ZEND_BEGIN_ARG_INFO(arginfo_convert_uudecode, 0)
2626    ZEND_ARG_INFO(0, data)
2627ZEND_END_ARG_INFO()
2628/* }}} */
2629/* {{{ var.c */
2630ZEND_BEGIN_ARG_INFO_EX(arginfo_var_dump, 0, 0, 1)
2631    ZEND_ARG_VARIADIC_INFO(0, vars)
2632ZEND_END_ARG_INFO()
2633
2634ZEND_BEGIN_ARG_INFO_EX(arginfo_debug_zval_dump, 0, 0, 1)
2635    ZEND_ARG_VARIADIC_INFO(0, vars)
2636ZEND_END_ARG_INFO()
2637
2638ZEND_BEGIN_ARG_INFO_EX(arginfo_var_export, 0, 0, 1)
2639    ZEND_ARG_INFO(0, var)
2640    ZEND_ARG_INFO(0, return)
2641ZEND_END_ARG_INFO()
2642
2643ZEND_BEGIN_ARG_INFO(arginfo_serialize, 0)
2644    ZEND_ARG_INFO(0, var)
2645ZEND_END_ARG_INFO()
2646
2647ZEND_BEGIN_ARG_INFO(arginfo_unserialize, 0)
2648    ZEND_ARG_INFO(0, variable_representation)
2649ZEND_END_ARG_INFO()
2650
2651ZEND_BEGIN_ARG_INFO_EX(arginfo_memory_get_usage, 0, 0, 0)
2652    ZEND_ARG_INFO(0, real_usage)
2653ZEND_END_ARG_INFO()
2654
2655ZEND_BEGIN_ARG_INFO_EX(arginfo_memory_get_peak_usage, 0, 0, 0)
2656    ZEND_ARG_INFO(0, real_usage)
2657ZEND_END_ARG_INFO()
2658/* }}} */
2659/* {{{ versioning.c */
2660ZEND_BEGIN_ARG_INFO_EX(arginfo_version_compare, 0, 0, 2)
2661    ZEND_ARG_INFO(0, ver1)
2662    ZEND_ARG_INFO(0, ver2)
2663    ZEND_ARG_INFO(0, oper)
2664ZEND_END_ARG_INFO()
2665/* }}} */
2666/* }}} */
2667
2668const zend_function_entry basic_functions[] = { /* {{{ */
2669    PHP_FE(constant,                                                        arginfo_constant)
2670    PHP_FE(bin2hex,                                                         arginfo_bin2hex)
2671    PHP_FE(hex2bin,                                                         arginfo_hex2bin)
2672    PHP_FE(sleep,                                                           arginfo_sleep)
2673    PHP_FE(usleep,                                                          arginfo_usleep)
2674#if HAVE_NANOSLEEP
2675    PHP_FE(time_nanosleep,                                                  arginfo_time_nanosleep)
2676    PHP_FE(time_sleep_until,                                                arginfo_time_sleep_until)
2677#endif
2678
2679#if HAVE_STRPTIME
2680    PHP_FE(strptime,                                                        arginfo_strptime)
2681#endif
2682
2683    PHP_FE(flush,                                                           arginfo_flush)
2684    PHP_FE(wordwrap,                                                        arginfo_wordwrap)
2685    PHP_FE(htmlspecialchars,                                                arginfo_htmlspecialchars)
2686    PHP_FE(htmlentities,                                                    arginfo_htmlentities)
2687    PHP_FE(html_entity_decode,                                              arginfo_html_entity_decode)
2688    PHP_FE(htmlspecialchars_decode,                                         arginfo_htmlspecialchars_decode)
2689    PHP_FE(get_html_translation_table,                                      arginfo_get_html_translation_table)
2690    PHP_FE(sha1,                                                            arginfo_sha1)
2691    PHP_FE(sha1_file,                                                       arginfo_sha1_file)
2692    PHP_NAMED_FE(md5,php_if_md5,                                            arginfo_md5)
2693    PHP_NAMED_FE(md5_file,php_if_md5_file,                                  arginfo_md5_file)
2694    PHP_NAMED_FE(crc32,php_if_crc32,                                        arginfo_crc32)
2695
2696    PHP_FE(iptcparse,                                                       arginfo_iptcparse)
2697    PHP_FE(iptcembed,                                                       arginfo_iptcembed)
2698    PHP_FE(getimagesize,                                                    arginfo_getimagesize)
2699    PHP_FE(getimagesizefromstring,                                          arginfo_getimagesize)
2700    PHP_FE(image_type_to_mime_type,                                         arginfo_image_type_to_mime_type)
2701    PHP_FE(image_type_to_extension,                                         arginfo_image_type_to_extension)
2702
2703    PHP_FE(phpinfo,                                                         arginfo_phpinfo)
2704    PHP_FE(phpversion,                                                      arginfo_phpversion)
2705    PHP_FE(phpcredits,                                                      arginfo_phpcredits)
2706    PHP_FE(php_sapi_name,                                                   arginfo_php_sapi_name)
2707    PHP_FE(php_uname,                                                       arginfo_php_uname)
2708    PHP_FE(php_ini_scanned_files,                                           arginfo_php_ini_scanned_files)
2709    PHP_FE(php_ini_loaded_file,                                             arginfo_php_ini_loaded_file)
2710
2711    PHP_FE(strnatcmp,                                                       arginfo_strnatcmp)
2712    PHP_FE(strnatcasecmp,                                                   arginfo_strnatcasecmp)
2713    PHP_FE(substr_count,                                                    arginfo_substr_count)
2714    PHP_FE(strspn,                                                          arginfo_strspn)
2715    PHP_FE(strcspn,                                                         arginfo_strcspn)
2716    PHP_FE(strtok,                                                          arginfo_strtok)
2717    PHP_FE(strtoupper,                                                      arginfo_strtoupper)
2718    PHP_FE(strtolower,                                                      arginfo_strtolower)
2719    PHP_FE(strpos,                                                          arginfo_strpos)
2720    PHP_FE(stripos,                                                         arginfo_stripos)
2721    PHP_FE(strrpos,                                                         arginfo_strrpos)
2722    PHP_FE(strripos,                                                        arginfo_strripos)
2723    PHP_FE(strrev,                                                          arginfo_strrev)
2724    PHP_FE(hebrev,                                                          arginfo_hebrev)
2725    PHP_FE(hebrevc,                                                         arginfo_hebrevc)
2726    PHP_FE(nl2br,                                                           arginfo_nl2br)
2727    PHP_FE(basename,                                                        arginfo_basename)
2728    PHP_FE(dirname,                                                         arginfo_dirname)
2729    PHP_FE(pathinfo,                                                        arginfo_pathinfo)
2730    PHP_FE(stripslashes,                                                    arginfo_stripslashes)
2731    PHP_FE(stripcslashes,                                                   arginfo_stripcslashes)
2732    PHP_FE(strstr,                                                          arginfo_strstr)
2733    PHP_FE(stristr,                                                         arginfo_stristr)
2734    PHP_FE(strrchr,                                                         arginfo_strrchr)
2735    PHP_FE(str_shuffle,                                                     arginfo_str_shuffle)
2736    PHP_FE(str_word_count,                                                  arginfo_str_word_count)
2737    PHP_FE(str_split,                                                       arginfo_str_split)
2738    PHP_FE(strpbrk,                                                         arginfo_strpbrk)
2739    PHP_FE(substr_compare,                                                  arginfo_substr_compare)
2740
2741#ifdef HAVE_STRCOLL
2742    PHP_FE(strcoll,                                                         arginfo_strcoll)
2743#endif
2744
2745#ifdef HAVE_STRFMON
2746    PHP_FE(money_format,                                                    arginfo_money_format)
2747#endif
2748
2749    PHP_FE(substr,                                                          arginfo_substr)
2750    PHP_FE(substr_replace,                                                  arginfo_substr_replace)
2751    PHP_FE(quotemeta,                                                       arginfo_quotemeta)
2752    PHP_FE(ucfirst,                                                         arginfo_ucfirst)
2753    PHP_FE(lcfirst,                                                         arginfo_lcfirst)
2754    PHP_FE(ucwords,                                                         arginfo_ucwords)
2755    PHP_FE(strtr,                                                           arginfo_strtr)
2756    PHP_FE(addslashes,                                                      arginfo_addslashes)
2757    PHP_FE(addcslashes,                                                     arginfo_addcslashes)
2758    PHP_FE(rtrim,                                                           arginfo_rtrim)
2759    PHP_FE(str_replace,                                                     arginfo_str_replace)
2760    PHP_FE(str_ireplace,                                                    arginfo_str_ireplace)
2761    PHP_FE(str_repeat,                                                      arginfo_str_repeat)
2762    PHP_FE(count_chars,                                                     arginfo_count_chars)
2763    PHP_FE(chunk_split,                                                     arginfo_chunk_split)
2764    PHP_FE(trim,                                                            arginfo_trim)
2765    PHP_FE(ltrim,                                                           arginfo_ltrim)
2766    PHP_FE(strip_tags,                                                      arginfo_strip_tags)
2767    PHP_FE(similar_text,                                                    arginfo_similar_text)
2768    PHP_FE(explode,                                                         arginfo_explode)
2769    PHP_FE(implode,                                                         arginfo_implode)
2770    PHP_FALIAS(join,                implode,                                arginfo_implode)
2771    PHP_FE(setlocale,                                                       arginfo_setlocale)
2772    PHP_FE(localeconv,                                                      arginfo_localeconv)
2773
2774#if HAVE_NL_LANGINFO
2775    PHP_FE(nl_langinfo,                                                     arginfo_nl_langinfo)
2776#endif
2777
2778    PHP_FE(soundex,                                                         arginfo_soundex)
2779    PHP_FE(levenshtein,                                                     arginfo_levenshtein)
2780    PHP_FE(chr,                                                             arginfo_chr)
2781    PHP_FE(ord,                                                             arginfo_ord)
2782    PHP_FE(parse_str,                                                       arginfo_parse_str)
2783    PHP_FE(str_getcsv,                                                      arginfo_str_getcsv)
2784    PHP_FE(str_pad,                                                         arginfo_str_pad)
2785    PHP_FALIAS(chop,                rtrim,                                  arginfo_rtrim)
2786    PHP_FALIAS(strchr,              strstr,                                 arginfo_strstr)
2787    PHP_NAMED_FE(sprintf,           PHP_FN(user_sprintf),                   arginfo_sprintf)
2788    PHP_NAMED_FE(printf,            PHP_FN(user_printf),                    arginfo_printf)
2789    PHP_FE(vprintf,                                                         arginfo_vprintf)
2790    PHP_FE(vsprintf,                                                        arginfo_vsprintf)
2791    PHP_FE(fprintf,                                                         arginfo_fprintf)
2792    PHP_FE(vfprintf,                                                        arginfo_vfprintf)
2793    PHP_FE(sscanf,                                                          arginfo_sscanf)
2794    PHP_FE(fscanf,                                                          arginfo_fscanf)
2795    PHP_FE(parse_url,                                                       arginfo_parse_url)
2796    PHP_FE(urlencode,                                                       arginfo_urlencode)
2797    PHP_FE(urldecode,                                                       arginfo_urldecode)
2798    PHP_FE(rawurlencode,                                                    arginfo_rawurlencode)
2799    PHP_FE(rawurldecode,                                                    arginfo_rawurldecode)
2800    PHP_FE(http_build_query,                                                arginfo_http_build_query)
2801
2802#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
2803    PHP_FE(readlink,                                                        arginfo_readlink)
2804    PHP_FE(linkinfo,                                                        arginfo_linkinfo)
2805    PHP_FE(symlink,                                                         arginfo_symlink)
2806    PHP_FE(link,                                                            arginfo_link)
2807#endif
2808
2809    PHP_FE(unlink,                                                          arginfo_unlink)
2810    PHP_FE(exec,                                                            arginfo_exec)
2811    PHP_FE(system,                                                          arginfo_system)
2812    PHP_FE(escapeshellcmd,                                                  arginfo_escapeshellcmd)
2813    PHP_FE(escapeshellarg,                                                  arginfo_escapeshellarg)
2814    PHP_FE(passthru,                                                        arginfo_passthru)
2815    PHP_FE(shell_exec,                                                      arginfo_shell_exec)
2816#ifdef PHP_CAN_SUPPORT_PROC_OPEN
2817    PHP_FE(proc_open,                                                       arginfo_proc_open)
2818    PHP_FE(proc_close,                                                      arginfo_proc_close)
2819    PHP_FE(proc_terminate,                                                  arginfo_proc_terminate)
2820    PHP_FE(proc_get_status,                                                 arginfo_proc_get_status)
2821#endif
2822
2823#ifdef HAVE_NICE
2824    PHP_FE(proc_nice,                                                       arginfo_proc_nice)
2825#endif
2826
2827    PHP_FE(rand,                                                            arginfo_rand)
2828    PHP_FE(srand,                                                           arginfo_srand)
2829    PHP_FE(getrandmax,                                                  arginfo_getrandmax)
2830    PHP_FE(mt_rand,                                                     arginfo_mt_rand)
2831    PHP_FE(mt_srand,                                                        arginfo_mt_srand)
2832    PHP_FE(mt_getrandmax,                                                   arginfo_mt_getrandmax)
2833
2834#if HAVE_GETSERVBYNAME
2835    PHP_FE(getservbyname,                                                   arginfo_getservbyname)
2836#endif
2837
2838#if HAVE_GETSERVBYPORT
2839    PHP_FE(getservbyport,                                                   arginfo_getservbyport)
2840#endif
2841
2842#if HAVE_GETPROTOBYNAME
2843    PHP_FE(getprotobyname,                                                  arginfo_getprotobyname)
2844#endif
2845
2846#if HAVE_GETPROTOBYNUMBER
2847    PHP_FE(getprotobynumber,                                                arginfo_getprotobynumber)
2848#endif
2849
2850    PHP_FE(getmyuid,                                                        arginfo_getmyuid)
2851    PHP_FE(getmygid,                                                        arginfo_getmygid)
2852    PHP_FE(getmypid,                                                        arginfo_getmypid)
2853    PHP_FE(getmyinode,                                                      arginfo_getmyinode)
2854    PHP_FE(getlastmod,                                                      arginfo_getlastmod)
2855
2856    PHP_FE(base64_decode,                                                   arginfo_base64_decode)
2857    PHP_FE(base64_encode,                                                   arginfo_base64_encode)
2858
2859    PHP_FE(password_hash,                                                   arginfo_password_hash)
2860    PHP_FE(password_get_info,                                               arginfo_password_get_info)
2861    PHP_FE(password_needs_rehash,                                           arginfo_password_needs_rehash)
2862    PHP_FE(password_verify,                                                 arginfo_password_verify)
2863    PHP_FE(convert_uuencode,                                                arginfo_convert_uuencode)
2864    PHP_FE(convert_uudecode,                                                arginfo_convert_uudecode)
2865
2866    PHP_FE(abs,                                                             arginfo_abs)
2867    PHP_FE(ceil,                                                            arginfo_ceil)
2868    PHP_FE(floor,                                                           arginfo_floor)
2869    PHP_FE(round,                                                           arginfo_round)
2870    PHP_FE(sin,                                                             arginfo_sin)
2871    PHP_FE(cos,                                                             arginfo_cos)
2872    PHP_FE(tan,                                                             arginfo_tan)
2873    PHP_FE(asin,                                                            arginfo_asin)
2874    PHP_FE(acos,                                                            arginfo_acos)
2875    PHP_FE(atan,                                                            arginfo_atan)
2876    PHP_FE(atanh,                                                           arginfo_atanh)
2877    PHP_FE(atan2,                                                           arginfo_atan2)
2878    PHP_FE(sinh,                                                            arginfo_sinh)
2879    PHP_FE(cosh,                                                            arginfo_cosh)
2880    PHP_FE(tanh,                                                            arginfo_tanh)
2881    PHP_FE(asinh,                                                           arginfo_asinh)
2882    PHP_FE(acosh,                                                           arginfo_acosh)
2883    PHP_FE(expm1,                                                           arginfo_expm1)
2884    PHP_FE(log1p,                                                           arginfo_log1p)
2885    PHP_FE(pi,                                                              arginfo_pi)
2886    PHP_FE(is_finite,                                                       arginfo_is_finite)
2887    PHP_FE(is_nan,                                                          arginfo_is_nan)
2888    PHP_FE(is_infinite,                                                     arginfo_is_infinite)
2889    PHP_FE(pow,                                                             arginfo_pow)
2890    PHP_FE(exp,                                                             arginfo_exp)
2891    PHP_FE(log,                                                             arginfo_log)
2892    PHP_FE(log10,                                                           arginfo_log10)
2893    PHP_FE(sqrt,                                                            arginfo_sqrt)
2894    PHP_FE(hypot,                                                           arginfo_hypot)
2895    PHP_FE(deg2rad,                                                         arginfo_deg2rad)
2896    PHP_FE(rad2deg,                                                         arginfo_rad2deg)
2897    PHP_FE(bindec,                                                          arginfo_bindec)
2898    PHP_FE(hexdec,                                                          arginfo_hexdec)
2899    PHP_FE(octdec,                                                          arginfo_octdec)
2900    PHP_FE(decbin,                                                          arginfo_decbin)
2901    PHP_FE(decoct,                                                          arginfo_decoct)
2902    PHP_FE(dechex,                                                          arginfo_dechex)
2903    PHP_FE(base_convert,                                                    arginfo_base_convert)
2904    PHP_FE(number_format,                                                   arginfo_number_format)
2905    PHP_FE(fmod,                                                            arginfo_fmod)
2906#ifdef HAVE_INET_NTOP
2907    PHP_RAW_NAMED_FE(inet_ntop,     php_inet_ntop,                              arginfo_inet_ntop)
2908#endif
2909#ifdef HAVE_INET_PTON
2910    PHP_RAW_NAMED_FE(inet_pton,     php_inet_pton,                              arginfo_inet_pton)
2911#endif
2912    PHP_FE(ip2long,                                                         arginfo_ip2long)
2913    PHP_FE(long2ip,                                                         arginfo_long2ip)
2914
2915    PHP_FE(getenv,                                                          arginfo_getenv)
2916#ifdef HAVE_PUTENV
2917    PHP_FE(putenv,                                                          arginfo_putenv)
2918#endif
2919
2920    PHP_FE(getopt,                                                          arginfo_getopt)
2921
2922#ifdef HAVE_GETLOADAVG
2923    PHP_FE(sys_getloadavg,                                                  arginfo_sys_getloadavg)
2924#endif
2925#ifdef HAVE_GETTIMEOFDAY
2926    PHP_FE(microtime,                                                       arginfo_microtime)
2927    PHP_FE(gettimeofday,                                                    arginfo_gettimeofday)
2928#endif
2929
2930#ifdef HAVE_GETRUSAGE
2931    PHP_FE(getrusage,                                                       arginfo_getrusage)
2932#endif
2933
2934#ifdef HAVE_GETTIMEOFDAY
2935    PHP_FE(uniqid,                                                          arginfo_uniqid)
2936#endif
2937
2938    PHP_FE(quoted_printable_decode,                                         arginfo_quoted_printable_decode)
2939    PHP_FE(quoted_printable_encode,                                         arginfo_quoted_printable_encode)
2940    PHP_FE(convert_cyr_string,                                              arginfo_convert_cyr_string)
2941    PHP_FE(get_current_user,                                                arginfo_get_current_user)
2942    PHP_FE(set_time_limit,                                                  arginfo_set_time_limit)
2943    PHP_FE(header_register_callback,                                        arginfo_header_register_callback)
2944    PHP_FE(get_cfg_var,                                                     arginfo_get_cfg_var)
2945
2946    PHP_DEP_FALIAS(magic_quotes_runtime,    set_magic_quotes_runtime,       arginfo_set_magic_quotes_runtime)
2947    PHP_DEP_FE(set_magic_quotes_runtime,                                    arginfo_set_magic_quotes_runtime)
2948    PHP_FE(get_magic_quotes_gpc,                                        arginfo_get_magic_quotes_gpc)
2949    PHP_FE(get_magic_quotes_runtime,                                    arginfo_get_magic_quotes_runtime)
2950
2951    PHP_FE(error_log,                                                       arginfo_error_log)
2952    PHP_FE(error_get_last,                                                  arginfo_error_get_last)
2953    PHP_FE(call_user_func,                                                  arginfo_call_user_func)
2954    PHP_FE(call_user_func_array,                                            arginfo_call_user_func_array)
2955    PHP_DEP_FE(call_user_method,                                            arginfo_call_user_method)
2956    PHP_DEP_FE(call_user_method_array,                                      arginfo_call_user_method_array)
2957    PHP_FE(forward_static_call,                                         arginfo_forward_static_call)
2958    PHP_FE(forward_static_call_array,                                       arginfo_forward_static_call_array)
2959    PHP_FE(serialize,                                                       arginfo_serialize)
2960    PHP_FE(unserialize,                                                     arginfo_unserialize)
2961
2962    PHP_FE(var_dump,                                                        arginfo_var_dump)
2963    PHP_FE(var_export,                                                      arginfo_var_export)
2964    PHP_FE(debug_zval_dump,                                                 arginfo_debug_zval_dump)
2965    PHP_FE(print_r,                                                         arginfo_print_r)
2966    PHP_FE(memory_get_usage,                                                arginfo_memory_get_usage)
2967    PHP_FE(memory_get_peak_usage,                                           arginfo_memory_get_peak_usage)
2968
2969    PHP_FE(register_shutdown_function,                                      arginfo_register_shutdown_function)
2970    PHP_FE(register_tick_function,                                          arginfo_register_tick_function)
2971    PHP_FE(unregister_tick_function,                                        arginfo_unregister_tick_function)
2972
2973    PHP_FE(highlight_file,                                                  arginfo_highlight_file)
2974    PHP_FALIAS(show_source,         highlight_file,                         arginfo_highlight_file)
2975    PHP_FE(highlight_string,                                                arginfo_highlight_string)
2976    PHP_FE(php_strip_whitespace,                                            arginfo_php_strip_whitespace)
2977
2978    PHP_FE(ini_get,                                                         arginfo_ini_get)
2979    PHP_FE(ini_get_all,                                                     arginfo_ini_get_all)
2980    PHP_FE(ini_set,                                                         arginfo_ini_set)
2981    PHP_FALIAS(ini_alter,           ini_set,                                arginfo_ini_set)
2982    PHP_FE(ini_restore,                                                     arginfo_ini_restore)
2983    PHP_FE(get_include_path,                                                arginfo_get_include_path)
2984    PHP_FE(set_include_path,                                                arginfo_set_include_path)
2985    PHP_FE(restore_include_path,                                            arginfo_restore_include_path)
2986
2987    PHP_FE(setcookie,                                                       arginfo_setcookie)
2988    PHP_FE(setrawcookie,                                                    arginfo_setrawcookie)
2989    PHP_FE(header,                                                          arginfo_header)
2990    PHP_FE(header_remove,                                                   arginfo_header_remove)
2991    PHP_FE(headers_sent,                                                    arginfo_headers_sent)
2992    PHP_FE(headers_list,                                                    arginfo_headers_list)
2993    PHP_FE(http_response_code,                                              arginfo_http_response_code)
2994
2995    PHP_FE(connection_aborted,                                              arginfo_connection_aborted)
2996    PHP_FE(connection_status,                                               arginfo_connection_status)
2997    PHP_FE(ignore_user_abort,                                               arginfo_ignore_user_abort)
2998    PHP_FE(parse_ini_file,                                                  arginfo_parse_ini_file)
2999    PHP_FE(parse_ini_string,                                                arginfo_parse_ini_string)
3000#if ZEND_DEBUG
3001    PHP_FE(config_get_hash,                                                 arginfo_config_get_hash)
3002#endif
3003    PHP_FE(is_uploaded_file,                                                arginfo_is_uploaded_file)
3004    PHP_FE(move_uploaded_file,                                              arginfo_move_uploaded_file)
3005
3006    /* functions from dns.c */
3007    PHP_FE(gethostbyaddr,                                                   arginfo_gethostbyaddr)
3008    PHP_FE(gethostbyname,                                                   arginfo_gethostbyname)
3009    PHP_FE(gethostbynamel,                                                  arginfo_gethostbynamel)
3010
3011#ifdef HAVE_GETHOSTNAME
3012    PHP_FE(gethostname,                                                 arginfo_gethostname)
3013#endif
3014
3015#if defined(PHP_WIN32) || (HAVE_DNS_SEARCH_FUNC && !(defined(__BEOS__) || defined(NETWARE)))
3016
3017    PHP_FE(dns_check_record,                                                arginfo_dns_check_record)
3018    PHP_FALIAS(checkdnsrr,          dns_check_record,                       arginfo_dns_check_record)
3019
3020# if defined(PHP_WIN32) || HAVE_FULL_DNS_FUNCS
3021    PHP_FE(dns_get_mx,                                                      arginfo_dns_get_mx)
3022    PHP_FALIAS(getmxrr,             dns_get_mx,                 arginfo_dns_get_mx)
3023    PHP_FE(dns_get_record,                                                  arginfo_dns_get_record)
3024# endif
3025#endif
3026
3027    /* functions from type.c */
3028    PHP_FE(intval,                                                          arginfo_intval)
3029    PHP_FE(floatval,                                                        arginfo_floatval)
3030    PHP_FALIAS(doubleval,           floatval,                               arginfo_floatval)
3031    PHP_FE(strval,                                                          arginfo_strval)
3032    PHP_FE(boolval,                                                         arginfo_boolval)
3033    PHP_FE(gettype,                                                         arginfo_gettype)
3034    PHP_FE(settype,                                                         arginfo_settype)
3035    PHP_FE(is_null,                                                         arginfo_is_null)
3036    PHP_FE(is_resource,                                                     arginfo_is_resource)
3037    PHP_FE(is_bool,                                                         arginfo_is_bool)
3038    PHP_FE(is_long,                                                         arginfo_is_long)
3039    PHP_FE(is_float,                                                        arginfo_is_float)
3040    PHP_FALIAS(is_int,              is_long,                                arginfo_is_long)
3041    PHP_FALIAS(is_integer,          is_long,                                arginfo_is_long)
3042    PHP_FALIAS(is_double,           is_float,                               arginfo_is_float)
3043    PHP_FALIAS(is_real,             is_float,                               arginfo_is_float)
3044    PHP_FE(is_numeric,                                                      arginfo_is_numeric)
3045    PHP_FE(is_string,                                                       arginfo_is_string)
3046    PHP_FE(is_array,                                                        arginfo_is_array)
3047    PHP_FE(is_object,                                                       arginfo_is_object)
3048    PHP_FE(is_scalar,                                                       arginfo_is_scalar)
3049    PHP_FE(is_callable,                                                     arginfo_is_callable)
3050
3051    /* functions from file.c */
3052    PHP_FE(pclose,                                                          arginfo_pclose)
3053    PHP_FE(popen,                                                           arginfo_popen)
3054    PHP_FE(readfile,                                                        arginfo_readfile)
3055    PHP_FE(rewind,                                                          arginfo_rewind)
3056    PHP_FE(rmdir,                                                           arginfo_rmdir)
3057    PHP_FE(umask,                                                           arginfo_umask)
3058    PHP_FE(fclose,                                                          arginfo_fclose)
3059    PHP_FE(feof,                                                            arginfo_feof)
3060    PHP_FE(fgetc,                                                           arginfo_fgetc)
3061    PHP_FE(fgets,                                                           arginfo_fgets)
3062    PHP_FE(fgetss,                                                          arginfo_fgetss)
3063    PHP_FE(fread,                                                           arginfo_fread)
3064    PHP_NAMED_FE(fopen,             php_if_fopen,                           arginfo_fopen)
3065    PHP_FE(fpassthru,                                                       arginfo_fpassthru)
3066    PHP_NAMED_FE(ftruncate,         php_if_ftruncate,                       arginfo_ftruncate)
3067    PHP_NAMED_FE(fstat,             php_if_fstat,                           arginfo_fstat)
3068    PHP_FE(fseek,                                                           arginfo_fseek)
3069    PHP_FE(ftell,                                                           arginfo_ftell)
3070    PHP_FE(fflush,                                                          arginfo_fflush)
3071    PHP_FE(fwrite,                                                          arginfo_fwrite)
3072    PHP_FALIAS(fputs,               fwrite,                                 arginfo_fwrite)
3073    PHP_FE(mkdir,                                                           arginfo_mkdir)
3074    PHP_FE(rename,                                                          arginfo_rename)
3075    PHP_FE(copy,                                                            arginfo_copy)
3076    PHP_FE(tempnam,                                                         arginfo_tempnam)
3077    PHP_NAMED_FE(tmpfile,           php_if_tmpfile,                         arginfo_tmpfile)
3078    PHP_FE(file,                                                            arginfo_file)
3079    PHP_FE(file_get_contents,                                               arginfo_file_get_contents)
3080    PHP_FE(file_put_contents,                                               arginfo_file_put_contents)
3081    PHP_FE(stream_select,                                                   arginfo_stream_select)
3082    PHP_FE(stream_context_create,                                           arginfo_stream_context_create)
3083    PHP_FE(stream_context_set_params,                                       arginfo_stream_context_set_params)
3084    PHP_FE(stream_context_get_params,                                       arginfo_stream_context_get_params)
3085    PHP_FE(stream_context_set_option,                                       arginfo_stream_context_set_option)
3086    PHP_FE(stream_context_get_options,                                      arginfo_stream_context_get_options)
3087    PHP_FE(stream_context_get_default,                                      arginfo_stream_context_get_default)
3088    PHP_FE(stream_context_set_default,                                      arginfo_stream_context_set_default)
3089    PHP_FE(stream_filter_prepend,                                           arginfo_stream_filter_prepend)
3090    PHP_FE(stream_filter_append,                                            arginfo_stream_filter_append)
3091    PHP_FE(stream_filter_remove,                                            arginfo_stream_filter_remove)
3092    PHP_FE(stream_socket_client,                                            arginfo_stream_socket_client)
3093    PHP_FE(stream_socket_server,                                            arginfo_stream_socket_server)
3094    PHP_FE(stream_socket_accept,                                            arginfo_stream_socket_accept)
3095    PHP_FE(stream_socket_get_name,                                          arginfo_stream_socket_get_name)
3096    PHP_FE(stream_socket_recvfrom,                                          arginfo_stream_socket_recvfrom)
3097    PHP_FE(stream_socket_sendto,                                            arginfo_stream_socket_sendto)
3098    PHP_FE(stream_socket_enable_crypto,                                     arginfo_stream_socket_enable_crypto)
3099#ifdef HAVE_SHUTDOWN
3100    PHP_FE(stream_socket_shutdown,                                          arginfo_stream_socket_shutdown)
3101#endif
3102#if HAVE_SOCKETPAIR
3103    PHP_FE(stream_socket_pair,                                              arginfo_stream_socket_pair)
3104#endif
3105    PHP_FE(stream_copy_to_stream,                                           arginfo_stream_copy_to_stream)
3106    PHP_FE(stream_get_contents,                                             arginfo_stream_get_contents)
3107    PHP_FE(stream_supports_lock,                                            arginfo_stream_supports_lock)
3108    PHP_FE(fgetcsv,                                                         arginfo_fgetcsv)
3109    PHP_FE(fputcsv,                                                         arginfo_fputcsv)
3110    PHP_FE(flock,                                                           arginfo_flock)
3111    PHP_FE(get_meta_tags,                                                   arginfo_get_meta_tags)
3112    PHP_FE(stream_set_read_buffer,                                          arginfo_stream_set_read_buffer)
3113    PHP_FE(stream_set_write_buffer,                                         arginfo_stream_set_write_buffer)
3114    PHP_FALIAS(set_file_buffer, stream_set_write_buffer,                    arginfo_stream_set_write_buffer)
3115    PHP_FE(stream_set_chunk_size,                                           arginfo_stream_set_chunk_size)
3116
3117    PHP_DEP_FALIAS(set_socket_blocking, stream_set_blocking,                arginfo_stream_set_blocking)
3118    PHP_FE(stream_set_blocking,                                             arginfo_stream_set_blocking)
3119    PHP_FALIAS(socket_set_blocking, stream_set_blocking,                    arginfo_stream_set_blocking)
3120
3121    PHP_FE(stream_get_meta_data,                                            arginfo_stream_get_meta_data)
3122    PHP_FE(stream_get_line,                                                 arginfo_stream_get_line)
3123    PHP_FE(stream_wrapper_register,                                         arginfo_stream_wrapper_register)
3124    PHP_FALIAS(stream_register_wrapper, stream_wrapper_register,            arginfo_stream_wrapper_register)
3125    PHP_FE(stream_wrapper_unregister,                                       arginfo_stream_wrapper_unregister)
3126    PHP_FE(stream_wrapper_restore,                                          arginfo_stream_wrapper_restore)
3127    PHP_FE(stream_get_wrappers,                                             arginfo_stream_get_wrappers)
3128    PHP_FE(stream_get_transports,                                           arginfo_stream_get_transports)
3129    PHP_FE(stream_resolve_include_path,                                     arginfo_stream_resolve_include_path)
3130    PHP_FE(stream_is_local,                                             arginfo_stream_is_local)
3131    PHP_FE(get_headers,                                                     arginfo_get_headers)
3132
3133#if HAVE_SYS_TIME_H || defined(PHP_WIN32)
3134    PHP_FE(stream_set_timeout,                                              arginfo_stream_set_timeout)
3135    PHP_FALIAS(socket_set_timeout, stream_set_timeout,                      arginfo_stream_set_timeout)
3136#endif
3137
3138    PHP_FALIAS(socket_get_status, stream_get_meta_data,                     arginfo_stream_get_meta_data)
3139
3140#if (!defined(__BEOS__) && !defined(NETWARE) && HAVE_REALPATH) || defined(ZTS)
3141    PHP_FE(realpath,                                                        arginfo_realpath)
3142#endif
3143
3144#ifdef HAVE_FNMATCH
3145    PHP_FE(fnmatch,                                                         arginfo_fnmatch)
3146#endif
3147
3148    /* functions from fsock.c */
3149    PHP_FE(fsockopen,                                                       arginfo_fsockopen)
3150    PHP_FE(pfsockopen,                                                      arginfo_pfsockopen)
3151
3152    /* functions from pack.c */
3153    PHP_FE(pack,                                                            arginfo_pack)
3154    PHP_FE(unpack,                                                          arginfo_unpack)
3155
3156    /* functions from browscap.c */
3157    PHP_FE(get_browser,                                                     arginfo_get_browser)
3158
3159#if HAVE_CRYPT
3160    /* functions from crypt.c */
3161    PHP_FE(crypt,                                                           arginfo_crypt)
3162#endif
3163
3164    /* functions from dir.c */
3165    PHP_FE(opendir,                                                         arginfo_opendir)
3166    PHP_FE(closedir,                                                        arginfo_closedir)
3167    PHP_FE(chdir,                                                           arginfo_chdir)
3168
3169#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC
3170    PHP_FE(chroot,                                                          arginfo_chroot)
3171#endif
3172
3173    PHP_FE(getcwd,                                                          arginfo_getcwd)
3174    PHP_FE(rewinddir,                                                       arginfo_rewinddir)
3175    PHP_NAMED_FE(readdir,           php_if_readdir,                         arginfo_readdir)
3176    PHP_FALIAS(dir,                 getdir,                                 arginfo_dir)
3177    PHP_FE(scandir,                                                         arginfo_scandir)
3178#ifdef HAVE_GLOB
3179    PHP_FE(glob,                                                            arginfo_glob)
3180#endif
3181    /* functions from filestat.c */
3182    PHP_FE(fileatime,                                                       arginfo_fileatime)
3183    PHP_FE(filectime,                                                       arginfo_filectime)
3184    PHP_FE(filegroup,                                                       arginfo_filegroup)
3185    PHP_FE(fileinode,                                                       arginfo_fileinode)
3186    PHP_FE(filemtime,                                                       arginfo_filemtime)
3187    PHP_FE(fileowner,                                                       arginfo_fileowner)
3188    PHP_FE(fileperms,                                                       arginfo_fileperms)
3189    PHP_FE(filesize,                                                        arginfo_filesize)
3190    PHP_FE(filetype,                                                        arginfo_filetype)
3191    PHP_FE(file_exists,                                                     arginfo_file_exists)
3192    PHP_FE(is_writable,                                                     arginfo_is_writable)
3193    PHP_FALIAS(is_writeable,        is_writable,                            arginfo_is_writable)
3194    PHP_FE(is_readable,                                                     arginfo_is_readable)
3195    PHP_FE(is_executable,                                                   arginfo_is_executable)
3196    PHP_FE(is_file,                                                         arginfo_is_file)
3197    PHP_FE(is_dir,                                                          arginfo_is_dir)
3198    PHP_FE(is_link,                                                         arginfo_is_link)
3199    PHP_NAMED_FE(stat,              php_if_stat,                            arginfo_stat)
3200    PHP_NAMED_FE(lstat,             php_if_lstat,                           arginfo_lstat)
3201#ifndef NETWARE
3202    PHP_FE(chown,                                                           arginfo_chown)
3203    PHP_FE(chgrp,                                                           arginfo_chgrp)
3204#endif
3205#if HAVE_LCHOWN
3206    PHP_FE(lchown,                                                          arginfo_lchown)
3207#endif
3208#if HAVE_LCHOWN
3209    PHP_FE(lchgrp,                                                          arginfo_lchgrp)
3210#endif
3211    PHP_FE(chmod,                                                           arginfo_chmod)
3212#if HAVE_UTIME
3213    PHP_FE(touch,                                                           arginfo_touch)
3214#endif
3215    PHP_FE(clearstatcache,                                                  arginfo_clearstatcache)
3216    PHP_FE(disk_total_space,                                                arginfo_disk_total_space)
3217    PHP_FE(disk_free_space,                                                 arginfo_disk_free_space)
3218    PHP_FALIAS(diskfreespace,       disk_free_space,                        arginfo_disk_free_space)
3219    PHP_FE(realpath_cache_size,                                             arginfo_realpath_cache_size)
3220    PHP_FE(realpath_cache_get,                                              arginfo_realpath_cache_get)
3221
3222    /* functions from mail.c */
3223    PHP_FE(mail,                                                            arginfo_mail)
3224    PHP_FE(ezmlm_hash,                                                      arginfo_ezmlm_hash)
3225
3226    /* functions from syslog.c */
3227#ifdef HAVE_SYSLOG_H
3228    PHP_FE(openlog,                                                         arginfo_openlog)
3229    PHP_FE(syslog,                                                          arginfo_syslog)
3230    PHP_FE(closelog,                                                        arginfo_closelog)
3231#endif
3232
3233    /* functions from lcg.c */
3234    PHP_FE(lcg_value,                                                       arginfo_lcg_value)
3235
3236    /* functions from metaphone.c */
3237    PHP_FE(metaphone,                                                       arginfo_metaphone)
3238
3239    /* functions from output.c */
3240    PHP_FE(ob_start,                                                        arginfo_ob_start)
3241    PHP_FE(ob_flush,                                                        arginfo_ob_flush)
3242    PHP_FE(ob_clean,                                                        arginfo_ob_clean)
3243    PHP_FE(ob_end_flush,                                                    arginfo_ob_end_flush)
3244    PHP_FE(ob_end_clean,                                                    arginfo_ob_end_clean)
3245    PHP_FE(ob_get_flush,                                                    arginfo_ob_get_flush)
3246    PHP_FE(ob_get_clean,                                                    arginfo_ob_get_clean)
3247    PHP_FE(ob_get_length,                                                   arginfo_ob_get_length)
3248    PHP_FE(ob_get_level,                                                    arginfo_ob_get_level)
3249    PHP_FE(ob_get_status,                                                   arginfo_ob_get_status)
3250    PHP_FE(ob_get_contents,                                                 arginfo_ob_get_contents)
3251    PHP_FE(ob_implicit_flush,                                               arginfo_ob_implicit_flush)
3252    PHP_FE(ob_list_handlers,                                                arginfo_ob_list_handlers)
3253
3254    /* functions from array.c */
3255    PHP_FE(ksort,                                                           arginfo_ksort)
3256    PHP_FE(krsort,                                                          arginfo_krsort)
3257    PHP_FE(natsort,                                                         arginfo_natsort)
3258    PHP_FE(natcasesort,                                                     arginfo_natcasesort)
3259    PHP_FE(asort,                                                           arginfo_asort)
3260    PHP_FE(arsort,                                                          arginfo_arsort)
3261    PHP_FE(sort,                                                            arginfo_sort)
3262    PHP_FE(rsort,                                                           arginfo_rsort)
3263    PHP_FE(usort,                                                           arginfo_usort)
3264    PHP_FE(uasort,                                                          arginfo_uasort)
3265    PHP_FE(uksort,                                                          arginfo_uksort)
3266    PHP_FE(shuffle,                                                         arginfo_shuffle)
3267    PHP_FE(array_walk,                                                      arginfo_array_walk)
3268    PHP_FE(array_walk_recursive,                                            arginfo_array_walk_recursive)
3269    PHP_FE(count,                                                           arginfo_count)
3270    PHP_FE(end,                                                             arginfo_end)
3271    PHP_FE(prev,                                                            arginfo_prev)
3272    PHP_FE(next,                                                            arginfo_next)
3273    PHP_FE(reset,                                                           arginfo_reset)
3274    PHP_FE(current,                                                         arginfo_current)
3275    PHP_FE(key,                                                             arginfo_key)
3276    PHP_FE(min,                                                             arginfo_min)
3277    PHP_FE(max,                                                             arginfo_max)
3278    PHP_FE(in_array,                                                        arginfo_in_array)
3279    PHP_FE(array_search,                                                    arginfo_array_search)
3280    PHP_FE(extract,                                                         arginfo_extract)
3281    PHP_FE(compact,                                                         arginfo_compact)
3282    PHP_FE(array_fill,                                                      arginfo_array_fill)
3283    PHP_FE(array_fill_keys,                                                 arginfo_array_fill_keys)
3284    PHP_FE(range,                                                           arginfo_range)
3285    PHP_FE(array_multisort,                                                 arginfo_array_multisort)
3286    PHP_FE(array_push,                                                      arginfo_array_push)
3287    PHP_FE(array_pop,                                                       arginfo_array_pop)
3288    PHP_FE(array_shift,                                                     arginfo_array_shift)
3289    PHP_FE(array_unshift,                                                   arginfo_array_unshift)
3290    PHP_FE(array_splice,                                                    arginfo_array_splice)
3291    PHP_FE(array_slice,                                                     arginfo_array_slice)
3292    PHP_FE(array_merge,                                                     arginfo_array_merge)
3293    PHP_FE(array_merge_recursive,                                           arginfo_array_merge_recursive)
3294    PHP_FE(array_replace,                                                   arginfo_array_replace)
3295    PHP_FE(array_replace_recursive,                                         arginfo_array_replace_recursive)
3296    PHP_FE(array_keys,                                                      arginfo_array_keys)
3297    PHP_FE(array_values,                                                    arginfo_array_values)
3298    PHP_FE(array_count_values,                                              arginfo_array_count_values)
3299    PHP_FE(array_column,                                                    arginfo_array_column)
3300    PHP_FE(array_reverse,                                                   arginfo_array_reverse)
3301    PHP_FE(array_reduce,                                                    arginfo_array_reduce)
3302    PHP_FE(array_pad,                                                       arginfo_array_pad)
3303    PHP_FE(array_flip,                                                      arginfo_array_flip)
3304    PHP_FE(array_change_key_case,                                           arginfo_array_change_key_case)
3305    PHP_FE(array_rand,                                                      arginfo_array_rand)
3306    PHP_FE(array_unique,                                                    arginfo_array_unique)
3307    PHP_FE(array_intersect,                                                 arginfo_array_intersect)
3308    PHP_FE(array_intersect_key,                                             arginfo_array_intersect_key)
3309    PHP_FE(array_intersect_ukey,                                            arginfo_array_intersect_ukey)
3310    PHP_FE(array_uintersect,                                                arginfo_array_uintersect)
3311    PHP_FE(array_intersect_assoc,                                           arginfo_array_intersect_assoc)
3312    PHP_FE(array_uintersect_assoc,                                          arginfo_array_uintersect_assoc)
3313    PHP_FE(array_intersect_uassoc,                                          arginfo_array_intersect_uassoc)
3314    PHP_FE(array_uintersect_uassoc,                                         arginfo_array_uintersect_uassoc)
3315    PHP_FE(array_diff,                                                      arginfo_array_diff)
3316    PHP_FE(array_diff_key,                                                  arginfo_array_diff_key)
3317    PHP_FE(array_diff_ukey,                                                 arginfo_array_diff_ukey)
3318    PHP_FE(array_udiff,                                                     arginfo_array_udiff)
3319    PHP_FE(array_diff_assoc,                                                arginfo_array_diff_assoc)
3320    PHP_FE(array_udiff_assoc,                                               arginfo_array_udiff_assoc)
3321    PHP_FE(array_diff_uassoc,                                               arginfo_array_diff_uassoc)
3322    PHP_FE(array_udiff_uassoc,                                              arginfo_array_udiff_uassoc)
3323    PHP_FE(array_sum,                                                       arginfo_array_sum)
3324    PHP_FE(array_product,                                                   arginfo_array_product)
3325    PHP_FE(array_filter,                                                    arginfo_array_filter)
3326    PHP_FE(array_map,                                                       arginfo_array_map)
3327    PHP_FE(array_chunk,                                                     arginfo_array_chunk)
3328    PHP_FE(array_combine,                                                   arginfo_array_combine)
3329    PHP_FE(array_key_exists,                                                arginfo_array_key_exists)
3330
3331    /* aliases from array.c */
3332    PHP_FALIAS(pos,                 current,                                arginfo_current)
3333    PHP_FALIAS(sizeof,              count,                                  arginfo_count)
3334    PHP_FALIAS(key_exists,          array_key_exists,                       arginfo_array_key_exists)
3335
3336    /* functions from assert.c */
3337    PHP_FE(assert,                                                          arginfo_assert)
3338    PHP_FE(assert_options,                                                  arginfo_assert_options)
3339
3340    /* functions from versioning.c */
3341    PHP_FE(version_compare,                                                 arginfo_version_compare)
3342
3343    /* functions from ftok.c*/
3344#if HAVE_FTOK
3345    PHP_FE(ftok,                                                            arginfo_ftok)
3346#endif
3347
3348    PHP_FE(str_rot13,                                                       arginfo_str_rot13)
3349    PHP_FE(stream_get_filters,                                              arginfo_stream_get_filters)
3350    PHP_FE(stream_filter_register,                                          arginfo_stream_filter_register)
3351    PHP_FE(stream_bucket_make_writeable,                                    arginfo_stream_bucket_make_writeable)
3352    PHP_FE(stream_bucket_prepend,                                           arginfo_stream_bucket_prepend)
3353    PHP_FE(stream_bucket_append,                                            arginfo_stream_bucket_append)
3354    PHP_FE(stream_bucket_new,                                               arginfo_stream_bucket_new)
3355
3356    PHP_FE(output_add_rewrite_var,                                          arginfo_output_add_rewrite_var)
3357    PHP_FE(output_reset_rewrite_vars,                                       arginfo_output_reset_rewrite_vars)
3358
3359    PHP_FE(sys_get_temp_dir,                                                arginfo_sys_get_temp_dir)
3360
3361    PHP_FE_END
3362};
3363/* }}} */
3364
3365static const zend_module_dep standard_deps[] = { /* {{{ */
3366    ZEND_MOD_OPTIONAL("session")
3367    ZEND_MOD_END
3368};
3369/* }}} */
3370
3371zend_module_entry basic_functions_module = { /* {{{ */
3372    STANDARD_MODULE_HEADER_EX,
3373    NULL,
3374    standard_deps,
3375    "standard",                 /* extension name */
3376    basic_functions,            /* function list */
3377    PHP_MINIT(basic),           /* process startup */
3378    PHP_MSHUTDOWN(basic),       /* process shutdown */
3379    PHP_RINIT(basic),           /* request startup */
3380    PHP_RSHUTDOWN(basic),       /* request shutdown */
3381    PHP_MINFO(basic),           /* extension info */
3382    PHP_VERSION,                /* extension version */
3383    STANDARD_MODULE_PROPERTIES
3384};
3385/* }}} */
3386
3387#if defined(HAVE_PUTENV)
3388static void php_putenv_destructor(putenv_entry *pe) /* {{{ */
3389{
3390    if (pe->previous_value) {
3391#if _MSC_VER >= 1300
3392        /* VS.Net has a bug in putenv() when setting a variable that
3393         * is already set; if the SetEnvironmentVariable() API call
3394         * fails, the Crt will double free() a string.
3395         * We try to avoid this by setting our own value first */
3396        SetEnvironmentVariable(pe->key, "bugbug");
3397#endif
3398        putenv(pe->previous_value);
3399# if defined(PHP_WIN32)
3400        efree(pe->previous_value);
3401# endif
3402    } else {
3403# if HAVE_UNSETENV
3404        unsetenv(pe->key);
3405# elif defined(PHP_WIN32)
3406        SetEnvironmentVariable(pe->key, NULL);
3407# ifndef ZTS
3408        _putenv_s(pe->key, "");
3409# endif
3410# else
3411        char **env;
3412
3413        for (env = environ; env != NULL && *env != NULL; env++) {
3414            if (!strncmp(*env, pe->key, pe->key_len) && (*env)[pe->key_len] == '=') {   /* found it */
3415                *env = "";
3416                break;
3417            }
3418        }
3419# endif
3420    }
3421#ifdef HAVE_TZSET
3422    /* don't forget to reset the various libc globals that
3423     * we might have changed by an earlier call to tzset(). */
3424    if (!strncmp(pe->key, "TZ", pe->key_len)) {
3425        tzset();
3426    }
3427#endif
3428
3429    efree(pe->putenv_string);
3430    efree(pe->key);
3431}
3432/* }}} */
3433#endif
3434
3435static void basic_globals_ctor(php_basic_globals *basic_globals_p TSRMLS_DC) /* {{{ */
3436{
3437    BG(rand_is_seeded) = 0;
3438    BG(mt_rand_is_seeded) = 0;
3439    BG(umask) = -1;
3440    BG(next) = NULL;
3441    BG(left) = -1;
3442    BG(user_tick_functions) = NULL;
3443    BG(user_filter_map) = NULL;
3444    BG(serialize_lock) = 0;
3445
3446    memset(&BG(serialize), 0, sizeof(BG(serialize)));
3447    memset(&BG(unserialize), 0, sizeof(BG(unserialize)));
3448
3449    memset(&BG(url_adapt_state_ex), 0, sizeof(BG(url_adapt_state_ex)));
3450
3451#if defined(_REENTRANT) && defined(HAVE_MBRLEN) && defined(HAVE_MBSTATE_T)
3452    memset(&BG(mblen_state), 0, sizeof(BG(mblen_state)));
3453#endif
3454
3455    BG(incomplete_class) = incomplete_class_entry;
3456    BG(page_uid) = -1;
3457    BG(page_gid) = -1;
3458}
3459/* }}} */
3460
3461static void basic_globals_dtor(php_basic_globals *basic_globals_p TSRMLS_DC) /* {{{ */
3462{
3463    if (BG(url_adapt_state_ex).tags) {
3464        zend_hash_destroy(BG(url_adapt_state_ex).tags);
3465        free(BG(url_adapt_state_ex).tags);
3466    }
3467}
3468/* }}} */
3469
3470#define PHP_DOUBLE_INFINITY_HIGH       0x7ff00000
3471#define PHP_DOUBLE_QUIET_NAN_HIGH      0xfff80000
3472
3473PHPAPI double php_get_nan(void) /* {{{ */
3474{
3475#if HAVE_HUGE_VAL_NAN
3476    return HUGE_VAL + -HUGE_VAL;
3477#elif defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || defined(__alpha)
3478    double val = 0.0;
3479    ((php_uint32*)&val)[1] = PHP_DOUBLE_QUIET_NAN_HIGH;
3480    ((php_uint32*)&val)[0] = 0;
3481    return val;
3482#elif HAVE_ATOF_ACCEPTS_NAN
3483    return atof("NAN");
3484#else
3485    return 0.0/0.0;
3486#endif
3487}
3488/* }}} */
3489
3490PHPAPI double php_get_inf(void) /* {{{ */
3491{
3492#if HAVE_HUGE_VAL_INF
3493    return HUGE_VAL;
3494#elif defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || defined(__alpha)
3495    double val = 0.0;
3496    ((php_uint32*)&val)[1] = PHP_DOUBLE_INFINITY_HIGH;
3497    ((php_uint32*)&val)[0] = 0;
3498    return val;
3499#elif HAVE_ATOF_ACCEPTS_INF
3500    return atof("INF");
3501#else
3502    return 1.0/0.0;
3503#endif
3504}
3505/* }}} */
3506
3507#define BASIC_MINIT_SUBMODULE(module) \
3508    if (PHP_MINIT(module)(INIT_FUNC_ARGS_PASSTHRU) == SUCCESS) {\
3509        BASIC_ADD_SUBMODULE(module); \
3510    }
3511
3512#define BASIC_ADD_SUBMODULE(module) \
3513    zend_hash_add_empty_element(&basic_submodules, #module, strlen(#module));
3514
3515#define BASIC_RINIT_SUBMODULE(module) \
3516    if (zend_hash_exists(&basic_submodules, #module, strlen(#module))) { \
3517        PHP_RINIT(module)(INIT_FUNC_ARGS_PASSTHRU); \
3518    }
3519
3520#define BASIC_MINFO_SUBMODULE(module) \
3521    if (zend_hash_exists(&basic_submodules, #module, strlen(#module))) { \
3522        PHP_MINFO(module)(ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU); \
3523    }
3524
3525#define BASIC_RSHUTDOWN_SUBMODULE(module) \
3526    if (zend_hash_exists(&basic_submodules, #module, strlen(#module))) { \
3527        PHP_RSHUTDOWN(module)(SHUTDOWN_FUNC_ARGS_PASSTHRU); \
3528    }
3529
3530#define BASIC_MSHUTDOWN_SUBMODULE(module) \
3531    if (zend_hash_exists(&basic_submodules, #module, strlen(#module))) { \
3532        PHP_MSHUTDOWN(module)(SHUTDOWN_FUNC_ARGS_PASSTHRU); \
3533    }
3534
3535PHP_MINIT_FUNCTION(basic) /* {{{ */
3536{
3537#ifdef ZTS
3538    ts_allocate_id(&basic_globals_id, sizeof(php_basic_globals), (ts_allocate_ctor) basic_globals_ctor, (ts_allocate_dtor) basic_globals_dtor);
3539#ifdef PHP_WIN32
3540    ts_allocate_id(&php_win32_core_globals_id, sizeof(php_win32_core_globals), (ts_allocate_ctor)php_win32_core_globals_ctor, (ts_allocate_dtor)php_win32_core_globals_dtor );
3541#endif
3542#else
3543    basic_globals_ctor(&basic_globals TSRMLS_CC);
3544#ifdef PHP_WIN32
3545    php_win32_core_globals_ctor(&the_php_win32_core_globals TSRMLS_CC);
3546#endif
3547#endif
3548
3549    zend_hash_init(&basic_submodules, 0, NULL, NULL, 1);
3550
3551    BG(incomplete_class) = incomplete_class_entry = php_create_incomplete_class(TSRMLS_C);
3552
3553    REGISTER_LONG_CONSTANT("CONNECTION_ABORTED", PHP_CONNECTION_ABORTED, CONST_CS | CONST_PERSISTENT);
3554    REGISTER_LONG_CONSTANT("CONNECTION_NORMAL",  PHP_CONNECTION_NORMAL,  CONST_CS | CONST_PERSISTENT);
3555    REGISTER_LONG_CONSTANT("CONNECTION_TIMEOUT", PHP_CONNECTION_TIMEOUT, CONST_CS | CONST_PERSISTENT);
3556
3557    REGISTER_LONG_CONSTANT("INI_USER",   ZEND_INI_USER,   CONST_CS | CONST_PERSISTENT);
3558    REGISTER_LONG_CONSTANT("INI_PERDIR", ZEND_INI_PERDIR, CONST_CS | CONST_PERSISTENT);
3559    REGISTER_LONG_CONSTANT("INI_SYSTEM", ZEND_INI_SYSTEM, CONST_CS | CONST_PERSISTENT);
3560    REGISTER_LONG_CONSTANT("INI_ALL",    ZEND_INI_ALL,    CONST_CS | CONST_PERSISTENT);
3561
3562    REGISTER_LONG_CONSTANT("INI_SCANNER_NORMAL", ZEND_INI_SCANNER_NORMAL, CONST_CS | CONST_PERSISTENT);
3563    REGISTER_LONG_CONSTANT("INI_SCANNER_RAW",    ZEND_INI_SCANNER_RAW,    CONST_CS | CONST_PERSISTENT);
3564    REGISTER_LONG_CONSTANT("INI_SCANNER_TYPED",  ZEND_INI_SCANNER_TYPED,  CONST_CS | CONST_PERSISTENT);
3565
3566    REGISTER_LONG_CONSTANT("PHP_URL_SCHEME", PHP_URL_SCHEME, CONST_CS | CONST_PERSISTENT);
3567    REGISTER_LONG_CONSTANT("PHP_URL_HOST", PHP_URL_HOST, CONST_CS | CONST_PERSISTENT);
3568    REGISTER_LONG_CONSTANT("PHP_URL_PORT", PHP_URL_PORT, CONST_CS | CONST_PERSISTENT);
3569    REGISTER_LONG_CONSTANT("PHP_URL_USER", PHP_URL_USER, CONST_CS | CONST_PERSISTENT);
3570    REGISTER_LONG_CONSTANT("PHP_URL_PASS", PHP_URL_PASS, CONST_CS | CONST_PERSISTENT);
3571    REGISTER_LONG_CONSTANT("PHP_URL_PATH", PHP_URL_PATH, CONST_CS | CONST_PERSISTENT);
3572    REGISTER_LONG_CONSTANT("PHP_URL_QUERY", PHP_URL_QUERY, CONST_CS | CONST_PERSISTENT);
3573    REGISTER_LONG_CONSTANT("PHP_URL_FRAGMENT", PHP_URL_FRAGMENT, CONST_CS | CONST_PERSISTENT);
3574    REGISTER_LONG_CONSTANT("PHP_QUERY_RFC1738", PHP_QUERY_RFC1738, CONST_CS | CONST_PERSISTENT);
3575    REGISTER_LONG_CONSTANT("PHP_QUERY_RFC3986", PHP_QUERY_RFC3986, CONST_CS | CONST_PERSISTENT);
3576
3577#define REGISTER_MATH_CONSTANT(x)  REGISTER_DOUBLE_CONSTANT(#x, x, CONST_CS | CONST_PERSISTENT)
3578    REGISTER_MATH_CONSTANT(M_E);
3579    REGISTER_MATH_CONSTANT(M_LOG2E);
3580    REGISTER_MATH_CONSTANT(M_LOG10E);
3581    REGISTER_MATH_CONSTANT(M_LN2);
3582    REGISTER_MATH_CONSTANT(M_LN10);
3583    REGISTER_MATH_CONSTANT(M_PI);
3584    REGISTER_MATH_CONSTANT(M_PI_2);
3585    REGISTER_MATH_CONSTANT(M_PI_4);
3586    REGISTER_MATH_CONSTANT(M_1_PI);
3587    REGISTER_MATH_CONSTANT(M_2_PI);
3588    REGISTER_MATH_CONSTANT(M_SQRTPI);
3589    REGISTER_MATH_CONSTANT(M_2_SQRTPI);
3590    REGISTER_MATH_CONSTANT(M_LNPI);
3591    REGISTER_MATH_CONSTANT(M_EULER);
3592    REGISTER_MATH_CONSTANT(M_SQRT2);
3593    REGISTER_MATH_CONSTANT(M_SQRT1_2);
3594    REGISTER_MATH_CONSTANT(M_SQRT3);
3595    REGISTER_DOUBLE_CONSTANT("INF", php_get_inf(), CONST_CS | CONST_PERSISTENT);
3596    REGISTER_DOUBLE_CONSTANT("NAN", php_get_nan(), CONST_CS | CONST_PERSISTENT);
3597
3598    REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_UP", PHP_ROUND_HALF_UP, CONST_CS | CONST_PERSISTENT);
3599    REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_DOWN", PHP_ROUND_HALF_DOWN, CONST_CS | CONST_PERSISTENT);
3600    REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_EVEN", PHP_ROUND_HALF_EVEN, CONST_CS | CONST_PERSISTENT);
3601    REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_ODD", PHP_ROUND_HALF_ODD, CONST_CS | CONST_PERSISTENT);
3602
3603#if ENABLE_TEST_CLASS
3604    test_class_startup();
3605#endif
3606
3607    register_phpinfo_constants(INIT_FUNC_ARGS_PASSTHRU);
3608    register_html_constants(INIT_FUNC_ARGS_PASSTHRU);
3609    register_string_constants(INIT_FUNC_ARGS_PASSTHRU);
3610
3611    BASIC_ADD_SUBMODULE(dl)
3612    BASIC_ADD_SUBMODULE(mail)
3613    BASIC_ADD_SUBMODULE(streams)
3614    BASIC_MINIT_SUBMODULE(file)
3615    BASIC_MINIT_SUBMODULE(pack)
3616    BASIC_MINIT_SUBMODULE(browscap)
3617    BASIC_MINIT_SUBMODULE(standard_filters)
3618    BASIC_MINIT_SUBMODULE(user_filters)
3619    BASIC_MINIT_SUBMODULE(password)
3620
3621#if defined(HAVE_LOCALECONV) && defined(ZTS)
3622    BASIC_MINIT_SUBMODULE(localeconv)
3623#endif
3624
3625#if defined(HAVE_NL_LANGINFO)
3626    BASIC_MINIT_SUBMODULE(nl_langinfo)
3627#endif
3628
3629#if HAVE_CRYPT
3630    BASIC_MINIT_SUBMODULE(crypt)
3631#endif
3632
3633    BASIC_MINIT_SUBMODULE(lcg)
3634
3635    BASIC_MINIT_SUBMODULE(dir)
3636#ifdef HAVE_SYSLOG_H
3637    BASIC_MINIT_SUBMODULE(syslog)
3638#endif
3639    BASIC_MINIT_SUBMODULE(array)
3640    BASIC_MINIT_SUBMODULE(assert)
3641    BASIC_MINIT_SUBMODULE(url_scanner_ex)
3642#ifdef PHP_CAN_SUPPORT_PROC_OPEN
3643    BASIC_MINIT_SUBMODULE(proc_open)
3644#endif
3645
3646    BASIC_MINIT_SUBMODULE(user_streams)
3647    BASIC_MINIT_SUBMODULE(imagetypes)
3648
3649    php_register_url_stream_wrapper("php", &php_stream_php_wrapper TSRMLS_CC);
3650    php_register_url_stream_wrapper("file", &php_plain_files_wrapper TSRMLS_CC);
3651#ifdef HAVE_GLOB
3652    php_register_url_stream_wrapper("glob", &php_glob_stream_wrapper TSRMLS_CC);
3653#endif
3654    php_register_url_stream_wrapper("data", &php_stream_rfc2397_wrapper TSRMLS_CC);
3655    php_register_url_stream_wrapper("http", &php_stream_http_wrapper TSRMLS_CC);
3656    php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper TSRMLS_CC);
3657
3658#if defined(PHP_WIN32) || (HAVE_DNS_SEARCH_FUNC && !(defined(__BEOS__) || defined(NETWARE)))
3659# if defined(PHP_WIN32) || HAVE_FULL_DNS_FUNCS
3660    BASIC_MINIT_SUBMODULE(dns)
3661# endif
3662#endif
3663
3664    return SUCCESS;
3665}
3666/* }}} */
3667
3668PHP_MSHUTDOWN_FUNCTION(basic) /* {{{ */
3669{
3670#ifdef HAVE_SYSLOG_H
3671    PHP_MSHUTDOWN(syslog)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
3672#endif
3673#ifdef ZTS
3674    ts_free_id(basic_globals_id);
3675#ifdef PHP_WIN32
3676    ts_free_id(php_win32_core_globals_id);
3677#endif
3678#else
3679    basic_globals_dtor(&basic_globals TSRMLS_CC);
3680#ifdef PHP_WIN32
3681    php_win32_core_globals_dtor(&the_php_win32_core_globals TSRMLS_CC);
3682#endif
3683#endif
3684
3685    php_unregister_url_stream_wrapper("php" TSRMLS_CC);
3686    php_unregister_url_stream_wrapper("http" TSRMLS_CC);
3687    php_unregister_url_stream_wrapper("ftp" TSRMLS_CC);
3688
3689    BASIC_MSHUTDOWN_SUBMODULE(browscap)
3690    BASIC_MSHUTDOWN_SUBMODULE(array)
3691    BASIC_MSHUTDOWN_SUBMODULE(assert)
3692    BASIC_MSHUTDOWN_SUBMODULE(url_scanner_ex)
3693    BASIC_MSHUTDOWN_SUBMODULE(file)
3694    BASIC_MSHUTDOWN_SUBMODULE(standard_filters)
3695#if defined(HAVE_LOCALECONV) && defined(ZTS)
3696    BASIC_MSHUTDOWN_SUBMODULE(localeconv)
3697#endif
3698#if HAVE_CRYPT
3699    BASIC_MSHUTDOWN_SUBMODULE(crypt)
3700#endif
3701
3702    zend_hash_destroy(&basic_submodules);
3703    return SUCCESS;
3704}
3705/* }}} */
3706
3707PHP_RINIT_FUNCTION(basic) /* {{{ */
3708{
3709    memset(BG(strtok_table), 0, 256);
3710
3711    BG(serialize_lock) = 0;
3712    memset(&BG(serialize), 0, sizeof(BG(serialize)));
3713    memset(&BG(unserialize), 0, sizeof(BG(unserialize)));
3714
3715    BG(strtok_string) = NULL;
3716    BG(strtok_zval) = NULL;
3717    BG(strtok_last) = NULL;
3718    BG(locale_string) = NULL;
3719    BG(array_walk_fci) = empty_fcall_info;
3720    BG(array_walk_fci_cache) = empty_fcall_info_cache;
3721    BG(user_compare_fci) = empty_fcall_info;
3722    BG(user_compare_fci_cache) = empty_fcall_info_cache;
3723    BG(page_uid) = -1;
3724    BG(page_gid) = -1;
3725    BG(page_inode) = -1;
3726    BG(page_mtime) = -1;
3727#ifdef HAVE_PUTENV
3728    if (zend_hash_init(&BG(putenv_ht), 1, NULL, (void (*)(void *)) php_putenv_destructor, 0) == FAILURE) {
3729        return FAILURE;
3730    }
3731#endif
3732    BG(user_shutdown_function_names) = NULL;
3733
3734    PHP_RINIT(filestat)(INIT_FUNC_ARGS_PASSTHRU);
3735#ifdef HAVE_SYSLOG_H
3736    BASIC_RINIT_SUBMODULE(syslog)
3737#endif
3738    BASIC_RINIT_SUBMODULE(dir)
3739    BASIC_RINIT_SUBMODULE(url_scanner_ex)
3740
3741    /* Setup default context */
3742    FG(default_context) = NULL;
3743
3744    /* Default to global wrappers only */
3745    FG(stream_wrappers) = NULL;
3746
3747    /* Default to global filters only */
3748    FG(stream_filters) = NULL;
3749
3750    return SUCCESS;
3751}
3752/* }}} */
3753
3754PHP_RSHUTDOWN_FUNCTION(basic) /* {{{ */
3755{
3756    if (BG(strtok_zval)) {
3757        zval_ptr_dtor(&BG(strtok_zval));
3758    }
3759    BG(strtok_string) = NULL;
3760    BG(strtok_zval) = NULL;
3761#ifdef HAVE_PUTENV
3762    zend_hash_destroy(&BG(putenv_ht));
3763#endif
3764
3765    if (BG(umask) != -1) {
3766        umask(BG(umask));
3767    }
3768
3769    /* Check if locale was changed and change it back
3770     * to the value in startup environment */
3771    if (BG(locale_string) != NULL) {
3772        setlocale(LC_ALL, "C");
3773        setlocale(LC_CTYPE, "");
3774        zend_update_current_locale();
3775    }
3776    STR_FREE(BG(locale_string));
3777    BG(locale_string) = NULL;
3778
3779    /* FG(stream_wrappers) and FG(stream_filters) are destroyed
3780     * during php_request_shutdown() */
3781
3782    PHP_RSHUTDOWN(filestat)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
3783#ifdef HAVE_SYSLOG_H
3784#ifdef PHP_WIN32
3785    BASIC_RSHUTDOWN_SUBMODULE(syslog)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
3786#endif
3787#endif
3788    BASIC_RSHUTDOWN_SUBMODULE(assert)
3789    BASIC_RSHUTDOWN_SUBMODULE(url_scanner_ex)
3790    BASIC_RSHUTDOWN_SUBMODULE(streams)
3791#ifdef PHP_WIN32
3792    BASIC_RSHUTDOWN_SUBMODULE(win32_core_globals)
3793#endif
3794
3795    if (BG(user_tick_functions)) {
3796        zend_llist_destroy(BG(user_tick_functions));
3797        efree(BG(user_tick_functions));
3798        BG(user_tick_functions) = NULL;
3799    }
3800
3801    BASIC_RSHUTDOWN_SUBMODULE(user_filters)
3802    BASIC_RSHUTDOWN_SUBMODULE(browscap)
3803
3804    BG(page_uid) = -1;
3805    BG(page_gid) = -1;
3806    return SUCCESS;
3807}
3808/* }}} */
3809
3810PHP_MINFO_FUNCTION(basic) /* {{{ */
3811{
3812    php_info_print_table_start();
3813    BASIC_MINFO_SUBMODULE(dl)
3814    BASIC_MINFO_SUBMODULE(mail)
3815    php_info_print_table_end();
3816    BASIC_MINFO_SUBMODULE(assert)
3817}
3818/* }}} */
3819
3820/* {{{ proto mixed constant(string const_name)
3821   Given the name of a constant this function will return the constant's associated value */
3822PHP_FUNCTION(constant)
3823{
3824    char *const_name;
3825    int const_name_len;
3826
3827    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &const_name, &const_name_len) == FAILURE) {
3828        return;
3829    }
3830
3831    if (!zend_get_constant_ex(const_name, const_name_len, return_value, NULL, ZEND_FETCH_CLASS_SILENT TSRMLS_CC)) {
3832        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't find constant %s", const_name);
3833        RETURN_NULL();
3834    }
3835}
3836/* }}} */
3837
3838#ifdef HAVE_INET_NTOP
3839/* {{{ proto string inet_ntop(string in_addr)
3840   Converts a packed inet address to a human readable IP address string */
3841PHP_NAMED_FUNCTION(php_inet_ntop)
3842{
3843    char *address;
3844    int address_len, af = AF_INET;
3845    char buffer[40];
3846
3847    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &address, &address_len) == FAILURE) {
3848        RETURN_FALSE;
3849    }
3850
3851#ifdef HAVE_IPV6
3852    if (address_len == 16) {
3853        af = AF_INET6;
3854    } else
3855#endif
3856    if (address_len != 4) {
3857        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid in_addr value");
3858        RETURN_FALSE;
3859    }
3860
3861    if (!inet_ntop(af, address, buffer, sizeof(buffer))) {
3862        php_error_docref(NULL TSRMLS_CC, E_WARNING, "An unknown error occurred");
3863        RETURN_FALSE;
3864    }
3865
3866    RETURN_STRING(buffer, 1);
3867}
3868/* }}} */
3869#endif /* HAVE_INET_NTOP */
3870
3871#ifdef HAVE_INET_PTON
3872/* {{{ proto string inet_pton(string ip_address)
3873   Converts a human readable IP address to a packed binary string */
3874PHP_NAMED_FUNCTION(php_inet_pton)
3875{
3876    int ret, af = AF_INET;
3877    char *address;
3878    int address_len;
3879    char buffer[17];
3880
3881    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &address, &address_len) == FAILURE) {
3882        RETURN_FALSE;
3883    }
3884
3885    memset(buffer, 0, sizeof(buffer));
3886
3887#ifdef HAVE_IPV6
3888    if (strchr(address, ':')) {
3889        af = AF_INET6;
3890    } else
3891#endif
3892    if (!strchr(address, '.')) {
3893        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unrecognized address %s", address);
3894        RETURN_FALSE;
3895    }
3896
3897    ret = inet_pton(af, address, buffer);
3898
3899    if (ret <= 0) {
3900        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unrecognized address %s", address);
3901        RETURN_FALSE;
3902    }
3903
3904    RETURN_STRINGL(buffer, af == AF_INET ? 4 : 16, 1);
3905}
3906/* }}} */
3907#endif /* HAVE_INET_PTON */
3908
3909/* {{{ proto int ip2long(string ip_address)
3910   Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address */
3911PHP_FUNCTION(ip2long)
3912{
3913    char *addr;
3914    int addr_len;
3915#ifdef HAVE_INET_PTON
3916    struct in_addr ip;
3917#else
3918    unsigned long int ip;
3919#endif
3920
3921    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &addr, &addr_len) == FAILURE) {
3922        return;
3923    }
3924
3925#ifdef HAVE_INET_PTON
3926    if (addr_len == 0 || inet_pton(AF_INET, addr, &ip) != 1) {
3927        RETURN_FALSE;
3928    }
3929    RETURN_LONG(ntohl(ip.s_addr));
3930#else
3931    if (addr_len == 0 || (ip = inet_addr(addr)) == INADDR_NONE) {
3932        /* The only special case when we should return -1 ourselves,
3933         * because inet_addr() considers it wrong. We return 0xFFFFFFFF and
3934         * not -1 or ~0 because of 32/64bit issues. */
3935        if (addr_len == sizeof("255.255.255.255") - 1 &&
3936            !memcmp(addr, "255.255.255.255", sizeof("255.255.255.255") - 1)
3937        ) {
3938            RETURN_LONG(0xFFFFFFFF);
3939        }
3940        RETURN_FALSE;
3941    }
3942    RETURN_LONG(ntohl(ip));
3943#endif
3944}
3945/* }}} */
3946
3947/* {{{ proto string long2ip(int proper_address)
3948   Converts an (IPv4) Internet network address into a string in Internet standard dotted format */
3949PHP_FUNCTION(long2ip)
3950{
3951    /* "It's a long but it's not, PHP ints are signed */
3952    char *ip;
3953    int ip_len;
3954    unsigned long n;
3955    struct in_addr myaddr;
3956#ifdef HAVE_INET_PTON
3957    char str[40];
3958#endif
3959
3960    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &ip, &ip_len) == FAILURE) {
3961        return;
3962    }
3963
3964    n = strtoul(ip, NULL, 0);
3965
3966    myaddr.s_addr = htonl(n);
3967#ifdef HAVE_INET_PTON
3968    if (inet_ntop(AF_INET, &myaddr, str, sizeof(str))) {
3969        RETURN_STRING(str, 1);
3970    } else {
3971        RETURN_FALSE;
3972    }
3973#else
3974    RETURN_STRING(inet_ntoa(myaddr), 1);
3975#endif
3976}
3977/* }}} */
3978
3979/********************
3980 * System Functions *
3981 ********************/
3982
3983/* {{{ proto string getenv(string varname)
3984   Get the value of an environment variable */
3985PHP_FUNCTION(getenv)
3986{
3987    char *ptr, *str;
3988    int str_len;
3989
3990    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
3991        RETURN_FALSE;
3992    }
3993
3994    /* SAPI method returns an emalloc()'d string */
3995    ptr = sapi_getenv(str, str_len TSRMLS_CC);
3996    if (ptr) {
3997        RETURN_STRING(ptr, 0);
3998    }
3999#ifdef PHP_WIN32
4000    {
4001        char dummybuf;
4002        int size;
4003
4004        SetLastError(0);
4005        /*If the given bugger is not large enough to hold the data, the return value is
4006        the buffer size,  in characters, required to hold the string and its terminating
4007        null character. We use this return value to alloc the final buffer. */
4008        size = GetEnvironmentVariableA(str, &dummybuf, 0);
4009        if (GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
4010                /* The environment variable doesn't exist. */
4011                RETURN_FALSE;
4012        }
4013
4014        if (size == 0) {
4015                /* env exists, but it is empty */
4016                RETURN_EMPTY_STRING();
4017        }
4018
4019        ptr = emalloc(size);
4020        size = GetEnvironmentVariableA(str, ptr, size);
4021        if (size == 0) {
4022                /* has been removed between the two calls */
4023                efree(ptr);
4024                RETURN_EMPTY_STRING();
4025        } else {
4026            RETURN_STRING(ptr, 0);
4027        }
4028    }
4029#else
4030    /* system method returns a const */
4031    ptr = getenv(str);
4032    if (ptr) {
4033        RETURN_STRING(ptr, 1);
4034    }
4035#endif
4036    RETURN_FALSE;
4037}
4038/* }}} */
4039
4040#ifdef HAVE_PUTENV
4041/* {{{ proto bool putenv(string setting)
4042   Set the value of an environment variable */
4043PHP_FUNCTION(putenv)
4044{
4045    char *setting;
4046    int setting_len;
4047    char *p, **env;
4048    putenv_entry pe;
4049#ifdef PHP_WIN32
4050    char *value = NULL;
4051    int equals = 0;
4052    int error_code;
4053#endif
4054
4055    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &setting, &setting_len) == FAILURE) {
4056        return;
4057    }
4058
4059    if(setting_len == 0 || setting[0] == '=') {
4060        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter syntax");
4061        RETURN_FALSE;
4062    }
4063
4064    pe.putenv_string = estrndup(setting, setting_len);
4065    pe.key = estrndup(setting, setting_len);
4066    if ((p = strchr(pe.key, '='))) {    /* nullify the '=' if there is one */
4067        *p = '\0';
4068#ifdef PHP_WIN32
4069        equals = 1;
4070#endif
4071    }
4072
4073    pe.key_len = strlen(pe.key);
4074#ifdef PHP_WIN32
4075    if (equals) {
4076        if (pe.key_len < setting_len - 1) {
4077            value = p + 1;
4078        } else {
4079            /* empty string*/
4080            value = p;
4081        }
4082    }
4083#endif
4084
4085    zend_hash_del(&BG(putenv_ht), pe.key, pe.key_len+1);
4086
4087    /* find previous value */
4088    pe.previous_value = NULL;
4089    for (env = environ; env != NULL && *env != NULL; env++) {
4090        if (!strncmp(*env, pe.key, pe.key_len) && (*env)[pe.key_len] == '=') {  /* found it */
4091#if defined(PHP_WIN32)
4092            /* must copy previous value because MSVCRT's putenv can free the string without notice */
4093            pe.previous_value = estrdup(*env);
4094#else
4095            pe.previous_value = *env;
4096#endif
4097            break;
4098        }
4099    }
4100
4101#if HAVE_UNSETENV
4102    if (!p) { /* no '=' means we want to unset it */
4103        unsetenv(pe.putenv_string);
4104    }
4105    if (!p || putenv(pe.putenv_string) == 0) { /* success */
4106#else
4107# ifndef PHP_WIN32
4108    if (putenv(pe.putenv_string) == 0) { /* success */
4109# else
4110    error_code = SetEnvironmentVariable(pe.key, value);
4111
4112    if (error_code != 0
4113# ifndef ZTS
4114    /* We need both SetEnvironmentVariable and _putenv here as some
4115        dependency lib could use either way to read the environment.
4116        Obviously the CRT version will be useful more often. But
4117        generally, doing both brings us on the safe track at least
4118        in NTS build. */
4119    && _putenv(pe.putenv_string) == 0
4120# endif
4121    ) { /* success */
4122# endif
4123#endif
4124        zend_hash_add(&BG(putenv_ht), pe.key, pe.key_len + 1, (void **) &pe, sizeof(putenv_entry), NULL);
4125#ifdef HAVE_TZSET
4126        if (!strncmp(pe.key, "TZ", pe.key_len)) {
4127            tzset();
4128        }
4129#endif
4130        RETURN_TRUE;
4131    } else {
4132        efree(pe.putenv_string);
4133        efree(pe.key);
4134        RETURN_FALSE;
4135    }
4136}
4137/* }}} */
4138#endif
4139
4140/* {{{ free_argv()
4141   Free the memory allocated to an argv array. */
4142static void free_argv(char **argv, int argc)
4143{
4144    int i;
4145
4146    if (argv) {
4147        for (i = 0; i < argc; i++) {
4148            if (argv[i]) {
4149                efree(argv[i]);
4150            }
4151        }
4152        efree(argv);
4153    }
4154}
4155/* }}} */
4156
4157/* {{{ free_longopts()
4158   Free the memory allocated to an longopt array. */
4159static void free_longopts(opt_struct *longopts)
4160{
4161    opt_struct *p;
4162
4163    if (longopts) {
4164        for (p = longopts; p && p->opt_char != '-'; p++) {
4165            if (p->opt_name != NULL) {
4166                efree((char *)(p->opt_name));
4167            }
4168        }
4169    }
4170}
4171/* }}} */
4172
4173/* {{{ parse_opts()
4174   Convert the typical getopt input characters to the php_getopt struct array */
4175static int parse_opts(char * opts, opt_struct ** result)
4176{
4177    opt_struct * paras = NULL;
4178    unsigned int i, count = 0;
4179
4180    for (i = 0; i < strlen(opts); i++) {
4181        if ((opts[i] >= 48 && opts[i] <= 57) ||
4182            (opts[i] >= 65 && opts[i] <= 90) ||
4183            (opts[i] >= 97 && opts[i] <= 122)
4184        ) {
4185            count++;
4186        }
4187    }
4188
4189    paras = safe_emalloc(sizeof(opt_struct), count, 0);
4190    memset(paras, 0, sizeof(opt_struct) * count);
4191    *result = paras;
4192    while ( (*opts >= 48 && *opts <= 57) || /* 0 - 9 */
4193            (*opts >= 65 && *opts <= 90) || /* A - Z */
4194            (*opts >= 97 && *opts <= 122)   /* a - z */
4195    ) {
4196        paras->opt_char = *opts;
4197        paras->need_param = (*(++opts) == ':') ? 1 : 0;
4198        paras->opt_name = NULL;
4199        if (paras->need_param == 1) {
4200            opts++;
4201            if (*opts == ':') {
4202                paras->need_param++;
4203                opts++;
4204            }
4205        }
4206        paras++;
4207    }
4208    return count;
4209}
4210/* }}} */
4211
4212/* {{{ proto array getopt(string options [, array longopts])
4213   Get options from the command line argument list */
4214PHP_FUNCTION(getopt)
4215{
4216    char *options = NULL, **argv = NULL;
4217    char opt[2] = { '\0' };
4218    char *optname;
4219    int argc = 0, options_len = 0, len, o;
4220    char *php_optarg = NULL;
4221    int php_optind = 1;
4222    zval *val, **args = NULL, *p_longopts = NULL;
4223    int optname_len = 0;
4224    opt_struct *opts, *orig_opts;
4225
4226    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|a", &options, &options_len, &p_longopts) == FAILURE) {
4227        RETURN_FALSE;
4228    }
4229
4230    /* Get argv from the global symbol table. We calculate argc ourselves
4231     * in order to be on the safe side, even though it is also available
4232     * from the symbol table. */
4233    if ((PG(http_globals)[TRACK_VARS_SERVER] || zend_is_auto_global(ZEND_STRL("_SERVER") TSRMLS_CC)) &&
4234        (zend_hash_find(Z_ARRVAL_P((PG(http_globals))[TRACK_VARS_SERVER]), "argv", sizeof("argv"), (void **) &args) != FAILURE ||
4235        zend_hash_find(&EG(symbol_table), "argv", sizeof("argv"), (void **) &args) != FAILURE) && Z_TYPE_PP(args) == IS_ARRAY
4236    ) {
4237        int pos = 0;
4238        zval **entry;
4239
4240        argc = zend_hash_num_elements(Z_ARRVAL_PP(args));
4241
4242        /* Attempt to allocate enough memory to hold all of the arguments
4243         * and a trailing NULL */
4244        argv = (char **) safe_emalloc(sizeof(char *), (argc + 1), 0);
4245
4246        /* Reset the array indexes. */
4247        zend_hash_internal_pointer_reset(Z_ARRVAL_PP(args));
4248
4249        /* Iterate over the hash to construct the argv array. */
4250        while (zend_hash_get_current_data(Z_ARRVAL_PP(args), (void **)&entry) == SUCCESS) {
4251            zval arg, *arg_ptr = *entry;
4252
4253            if (Z_TYPE_PP(entry) != IS_STRING) {
4254                arg = **entry;
4255                zval_copy_ctor(&arg);
4256                convert_to_string(&arg);
4257                arg_ptr = &arg;
4258            }
4259
4260            argv[pos++] = estrdup(Z_STRVAL_P(arg_ptr));
4261
4262            if (arg_ptr != *entry) {
4263                zval_dtor(&arg);
4264            }
4265
4266            zend_hash_move_forward(Z_ARRVAL_PP(args));
4267        }
4268
4269        /* The C Standard requires argv[argc] to be NULL - this might
4270         * keep some getopt implementations happy. */
4271        argv[argc] = NULL;
4272    } else {
4273        /* Return false if we can't find argv. */
4274        RETURN_FALSE;
4275    }
4276
4277    len = parse_opts(options, &opts);
4278
4279    if (p_longopts) {
4280        int count;
4281        zval **entry;
4282
4283        count = zend_hash_num_elements(Z_ARRVAL_P(p_longopts));
4284
4285        /* the first <len> slots are filled by the one short ops
4286         * we now extend our array and jump to the new added structs */
4287        opts = (opt_struct *) erealloc(opts, sizeof(opt_struct) * (len + count + 1));
4288        orig_opts = opts;
4289        opts += len;
4290
4291        memset(opts, 0, count * sizeof(opt_struct));
4292
4293        /* Reset the array indexes. */
4294        zend_hash_internal_pointer_reset(Z_ARRVAL_P(p_longopts));
4295
4296        /* Iterate over the hash to construct the argv array. */
4297        while (zend_hash_get_current_data(Z_ARRVAL_P(p_longopts), (void **)&entry) == SUCCESS) {
4298            zval arg, *arg_ptr = *entry;
4299
4300            if (Z_TYPE_PP(entry) != IS_STRING) {
4301                arg = **entry;
4302                zval_copy_ctor(&arg);
4303                convert_to_string(&arg);
4304                arg_ptr = &arg;
4305            }
4306
4307            opts->need_param = 0;
4308            opts->opt_name = estrdup(Z_STRVAL_P(arg_ptr));
4309            len = strlen(opts->opt_name);
4310            if ((len > 0) && (opts->opt_name[len - 1] == ':')) {
4311                opts->need_param++;
4312                opts->opt_name[len - 1] = '\0';
4313                if ((len > 1) && (opts->opt_name[len - 2] == ':')) {
4314                    opts->need_param++;
4315                    opts->opt_name[len - 2] = '\0';
4316                }
4317            }
4318            opts->opt_char = 0;
4319            opts++;
4320
4321            if (arg_ptr != *entry) {
4322                zval_dtor(&arg);
4323            }
4324
4325            zend_hash_move_forward(Z_ARRVAL_P(p_longopts));
4326        }
4327    } else {
4328        opts = (opt_struct*) erealloc(opts, sizeof(opt_struct) * (len + 1));
4329        orig_opts = opts;
4330        opts += len;
4331    }
4332
4333    /* php_getopt want to identify the last param */
4334    opts->opt_char   = '-';
4335    opts->need_param = 0;
4336    opts->opt_name   = NULL;
4337
4338    /* Initialize the return value as an array. */
4339    array_init(return_value);
4340
4341    /* after our pointer arithmetic jump back to the first element */
4342    opts = orig_opts;
4343
4344    while ((o = php_getopt(argc, argv, opts, &php_optarg, &php_optind, 0, 1)) != -1) {
4345        /* Skip unknown arguments. */
4346        if (o == '?') {
4347            continue;
4348        }
4349
4350        /* Prepare the option character and the argument string. */
4351        if (o == 0) {
4352            optname = opts[php_optidx].opt_name;
4353        } else {
4354            if (o == 1) {
4355                o = '-';
4356            }
4357            opt[0] = o;
4358            optname = opt;
4359        }
4360
4361        MAKE_STD_ZVAL(val);
4362        if (php_optarg != NULL) {
4363            /* keep the arg as binary, since the encoding is not known */
4364            ZVAL_STRING(val, php_optarg, 1);
4365        } else {
4366            ZVAL_FALSE(val);
4367        }
4368
4369        /* Add this option / argument pair to the result hash. */
4370        optname_len = strlen(optname);
4371        if (!(optname_len > 1 && optname[0] == '0') && is_numeric_string(optname, optname_len, NULL, NULL, 0) == IS_LONG) {
4372            /* numeric string */
4373            int optname_int = atoi(optname);
4374            if (zend_hash_index_find(HASH_OF(return_value), optname_int, (void **)&args) != FAILURE) {
4375                if (Z_TYPE_PP(args) != IS_ARRAY) {
4376                    convert_to_array_ex(args);
4377                }
4378                zend_hash_next_index_insert(HASH_OF(*args), (void *)&val, sizeof(zval *), NULL);
4379            } else {
4380                zend_hash_index_update(HASH_OF(return_value), optname_int, &val, sizeof(zval *), NULL);
4381            }
4382        } else {
4383            /* other strings */
4384            if (zend_hash_find(HASH_OF(return_value), optname, strlen(optname)+1, (void **)&args) != FAILURE) {
4385                if (Z_TYPE_PP(args) != IS_ARRAY) {
4386                    convert_to_array_ex(args);
4387                }
4388                zend_hash_next_index_insert(HASH_OF(*args), (void *)&val, sizeof(zval *), NULL);
4389            } else {
4390                zend_hash_add(HASH_OF(return_value), optname, strlen(optname)+1, (void *)&val, sizeof(zval *), NULL);
4391            }
4392        }
4393
4394        php_optarg = NULL;
4395    }
4396
4397    free_longopts(orig_opts);
4398    efree(orig_opts);
4399    free_argv(argv, argc);
4400}
4401/* }}} */
4402
4403/* {{{ proto void flush(void)
4404   Flush the output buffer */
4405PHP_FUNCTION(flush)
4406{
4407    sapi_flush(TSRMLS_C);
4408}
4409/* }}} */
4410
4411/* {{{ proto void sleep(int seconds)
4412   Delay for a given number of seconds */
4413PHP_FUNCTION(sleep)
4414{
4415    long num;
4416
4417    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
4418        RETURN_FALSE;
4419    }
4420    if (num < 0) {
4421        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of seconds must be greater than or equal to 0");
4422        RETURN_FALSE;
4423    }
4424#ifdef PHP_SLEEP_NON_VOID
4425    RETURN_LONG(php_sleep(num));
4426#else
4427    php_sleep(num);
4428#endif
4429
4430}
4431/* }}} */
4432
4433/* {{{ proto void usleep(int micro_seconds)
4434   Delay for a given number of micro seconds */
4435PHP_FUNCTION(usleep)
4436{
4437#if HAVE_USLEEP
4438    long num;
4439
4440    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
4441        return;
4442    }
4443    if (num < 0) {
4444        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of microseconds must be greater than or equal to 0");
4445        RETURN_FALSE;
4446    }
4447    usleep(num);
4448#endif
4449}
4450/* }}} */
4451
4452#if HAVE_NANOSLEEP
4453/* {{{ proto mixed time_nanosleep(long seconds, long nanoseconds)
4454   Delay for a number of seconds and nano seconds */
4455PHP_FUNCTION(time_nanosleep)
4456{
4457    long tv_sec, tv_nsec;
4458    struct timespec php_req, php_rem;
4459
4460    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &tv_sec, &tv_nsec) == FAILURE) {
4461        return;
4462    }
4463
4464    if (tv_sec < 0) {
4465        php_error_docref(NULL TSRMLS_CC, E_WARNING, "The seconds value must be greater than 0");
4466        RETURN_FALSE;
4467    }
4468    if (tv_nsec < 0) {
4469        php_error_docref(NULL TSRMLS_CC, E_WARNING, "The nanoseconds value must be greater than 0");
4470        RETURN_FALSE;
4471    }
4472
4473    php_req.tv_sec = (time_t) tv_sec;
4474    php_req.tv_nsec = tv_nsec;
4475    if (!nanosleep(&php_req, &php_rem)) {
4476        RETURN_TRUE;
4477    } else if (errno == EINTR) {
4478        array_init(return_value);
4479        add_assoc_long_ex(return_value, "seconds", sizeof("seconds"), php_rem.tv_sec);
4480        add_assoc_long_ex(return_value, "nanoseconds", sizeof("nanoseconds"), php_rem.tv_nsec);
4481        return;
4482    } else if (errno == EINVAL) {
4483        php_error_docref(NULL TSRMLS_CC, E_WARNING, "nanoseconds was not in the range 0 to 999 999 999 or seconds was negative");
4484    }
4485
4486    RETURN_FALSE;
4487}
4488/* }}} */
4489
4490/* {{{ proto mixed time_sleep_until(float timestamp)
4491   Make the script sleep until the specified time */
4492PHP_FUNCTION(time_sleep_until)
4493{
4494    double d_ts, c_ts;
4495    struct timeval tm;
4496    struct timespec php_req, php_rem;
4497
4498    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "d", &d_ts) == FAILURE) {
4499        return;
4500    }
4501
4502    if (gettimeofday((struct timeval *) &tm, NULL) != 0) {
4503        RETURN_FALSE;
4504    }
4505
4506    c_ts = (double)(d_ts - tm.tv_sec - tm.tv_usec / 1000000.00);
4507    if (c_ts < 0) {
4508        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sleep until to time is less than current time");
4509        RETURN_FALSE;
4510    }
4511
4512    php_req.tv_sec = (time_t) c_ts;
4513    if (php_req.tv_sec > c_ts) { /* rounding up occurred */
4514        php_req.tv_sec--;
4515    }
4516    /* 1sec = 1000000000 nanoseconds */
4517    php_req.tv_nsec = (long) ((c_ts - php_req.tv_sec) * 1000000000.00);
4518
4519    while (nanosleep(&php_req, &php_rem)) {
4520        if (errno == EINTR) {
4521            php_req.tv_sec = php_rem.tv_sec;
4522            php_req.tv_nsec = php_rem.tv_nsec;
4523        } else {
4524            RETURN_FALSE;
4525        }
4526    }
4527
4528    RETURN_TRUE;
4529}
4530/* }}} */
4531#endif
4532
4533/* {{{ proto string get_current_user(void)
4534   Get the name of the owner of the current PHP script */
4535PHP_FUNCTION(get_current_user)
4536{
4537    if (zend_parse_parameters_none() == FAILURE) {
4538        return;
4539    }
4540
4541    RETURN_STRING(php_get_current_user(TSRMLS_C), 1);
4542}
4543/* }}} */
4544
4545/* {{{ add_config_entry_cb
4546 */
4547static int add_config_entry_cb(zval *entry TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key)
4548{
4549    zval *retval = (zval *)va_arg(args, zval*);
4550    zval *tmp;
4551
4552    if (Z_TYPE_P(entry) == IS_STRING) {
4553        if (hash_key->nKeyLength > 0) {
4554            add_assoc_stringl_ex(retval, hash_key->arKey, hash_key->nKeyLength, Z_STRVAL_P(entry), Z_STRLEN_P(entry), 1);
4555        } else {
4556            add_index_stringl(retval, hash_key->h, Z_STRVAL_P(entry), Z_STRLEN_P(entry), 1);
4557        }
4558    } else if (Z_TYPE_P(entry) == IS_ARRAY) {
4559        MAKE_STD_ZVAL(tmp);
4560        array_init(tmp);
4561        zend_hash_apply_with_arguments(Z_ARRVAL_P(entry) TSRMLS_CC, (apply_func_args_t) add_config_entry_cb, 1, tmp);
4562        add_assoc_zval_ex(retval, hash_key->arKey, hash_key->nKeyLength, tmp);
4563    }
4564    return 0;
4565}
4566/* }}} */
4567
4568/* {{{ proto mixed get_cfg_var(string option_name)
4569   Get the value of a PHP configuration option */
4570PHP_FUNCTION(get_cfg_var)
4571{
4572    char *varname;
4573    int varname_len;
4574    zval *retval;
4575
4576    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &varname, &varname_len) == FAILURE) {
4577        return;
4578    }
4579
4580    retval = cfg_get_entry(varname, varname_len + 1);
4581
4582    if (retval) {
4583        if (Z_TYPE_P(retval) == IS_ARRAY) {
4584            array_init(return_value);
4585            zend_hash_apply_with_arguments(Z_ARRVAL_P(retval) TSRMLS_CC, (apply_func_args_t) add_config_entry_cb, 1, return_value);
4586            return;
4587        } else {
4588            RETURN_STRING(Z_STRVAL_P(retval), 1);
4589        }
4590    } else {
4591        RETURN_FALSE;
4592    }
4593}
4594/* }}} */
4595
4596/* {{{ proto bool set_magic_quotes_runtime(int new_setting)
4597   magic_quotes_runtime is not supported anymore */
4598PHP_FUNCTION(set_magic_quotes_runtime)
4599{
4600    zend_bool new_setting;
4601
4602    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &new_setting) == FAILURE) {
4603        return;
4604    }
4605
4606    if (new_setting) {
4607        php_error_docref(NULL TSRMLS_CC, E_CORE_ERROR, "magic_quotes_runtime is not supported anymore");
4608    }
4609    RETURN_FALSE;
4610}
4611/* }}} */
4612
4613/* {{{ proto int get_magic_quotes_runtime(void)
4614   Get the current active configuration setting of magic_quotes_runtime */
4615PHP_FUNCTION(get_magic_quotes_runtime)
4616{
4617    if (zend_parse_parameters_none() == FAILURE) {
4618        return;
4619    }
4620    RETURN_FALSE;
4621}
4622/* }}} */
4623
4624/* {{{ proto int get_magic_quotes_gpc(void)
4625   Get the current active configuration setting of magic_quotes_gpc */
4626PHP_FUNCTION(get_magic_quotes_gpc)
4627{
4628    if (zend_parse_parameters_none() == FAILURE) {
4629        return;
4630    }
4631    RETURN_FALSE;
4632}
4633/* }}} */
4634
4635/*
4636    1st arg = error message
4637    2nd arg = error option
4638    3rd arg = optional parameters (email address or tcp address)
4639    4th arg = used for additional headers if email
4640
4641error options:
4642    0 = send to php_error_log (uses syslog or file depending on ini setting)
4643    1 = send via email to 3rd parameter 4th option = additional headers
4644    2 = send via tcp/ip to 3rd parameter (name or ip:port)
4645    3 = save to file in 3rd parameter
4646    4 = send to SAPI logger directly
4647*/
4648
4649/* {{{ proto bool error_log(string message [, int message_type [, string destination [, string extra_headers]]])
4650   Send an error message somewhere */
4651PHP_FUNCTION(error_log)
4652{
4653    char *message, *opt = NULL, *headers = NULL;
4654    int message_len, opt_len = 0, headers_len = 0;
4655    int opt_err = 0, argc = ZEND_NUM_ARGS();
4656    long erropt = 0;
4657
4658    if (zend_parse_parameters(argc TSRMLS_CC, "s|lps", &message, &message_len, &erropt, &opt, &opt_len, &headers, &headers_len) == FAILURE) {
4659        return;
4660    }
4661
4662    if (argc > 1) {
4663        opt_err = erropt;
4664    }
4665
4666    if (_php_error_log_ex(opt_err, message, message_len, opt, headers TSRMLS_CC) == FAILURE) {
4667        RETURN_FALSE;
4668    }
4669
4670    RETURN_TRUE;
4671}
4672/* }}} */
4673
4674/* For BC (not binary-safe!) */
4675PHPAPI int _php_error_log(int opt_err, char *message, char *opt, char *headers TSRMLS_DC) /* {{{ */
4676{
4677    return _php_error_log_ex(opt_err, message, (opt_err == 3) ? strlen(message) : 0, opt, headers TSRMLS_CC);
4678}
4679/* }}} */
4680
4681PHPAPI int _php_error_log_ex(int opt_err, char *message, int message_len, char *opt, char *headers TSRMLS_DC) /* {{{ */
4682{
4683    php_stream *stream = NULL;
4684
4685    switch (opt_err)
4686    {
4687        case 1:     /*send an email */
4688            if (!php_mail(opt, "PHP error_log message", message, headers, NULL TSRMLS_CC)) {
4689                return FAILURE;
4690            }
4691            break;
4692
4693        case 2:     /*send to an address */
4694            php_error_docref(NULL TSRMLS_CC, E_WARNING, "TCP/IP option not available!");
4695            return FAILURE;
4696            break;
4697
4698        case 3:     /*save to a file */
4699            stream = php_stream_open_wrapper(opt, "a", IGNORE_URL_WIN | REPORT_ERRORS, NULL);
4700            if (!stream) {
4701                return FAILURE;
4702            }
4703            php_stream_write(stream, message, message_len);
4704            php_stream_close(stream);
4705            break;
4706
4707        case 4: /* send to SAPI */
4708            if (sapi_module.log_message) {
4709                sapi_module.log_message(message TSRMLS_CC);
4710            } else {
4711                return FAILURE;
4712            }
4713            break;
4714
4715        default:
4716            php_log_err(message TSRMLS_CC);
4717            break;
4718    }
4719    return SUCCESS;
4720}
4721/* }}} */
4722
4723/* {{{ proto array error_get_last()
4724   Get the last occurred error as associative array. Returns NULL if there hasn't been an error yet. */
4725PHP_FUNCTION(error_get_last)
4726{
4727    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) {
4728        return;
4729    }
4730
4731    if (PG(last_error_message)) {
4732        array_init(return_value);
4733        add_assoc_long_ex(return_value, "type", sizeof("type"), PG(last_error_type));
4734        add_assoc_string_ex(return_value, "message", sizeof("message"), PG(last_error_message), 1);
4735        add_assoc_string_ex(return_value, "file", sizeof("file"), PG(last_error_file)?PG(last_error_file):"-", 1 );
4736        add_assoc_long_ex(return_value, "line", sizeof("line"), PG(last_error_lineno));
4737    }
4738}
4739/* }}} */
4740
4741/* {{{ proto mixed call_user_func(mixed function_name [, mixed parmeter] [, mixed ...])
4742   Call a user function which is the first parameter */
4743PHP_FUNCTION(call_user_func)
4744{
4745    zval *retval_ptr = NULL;
4746    zend_fcall_info fci;
4747    zend_fcall_info_cache fci_cache;
4748
4749    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "f*", &fci, &fci_cache, &fci.params, &fci.param_count) == FAILURE) {
4750        return;
4751    }
4752
4753    fci.retval_ptr_ptr = &retval_ptr;
4754
4755    if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && fci.retval_ptr_ptr && *fci.retval_ptr_ptr) {
4756        COPY_PZVAL_TO_ZVAL(*return_value, *fci.retval_ptr_ptr);
4757    }
4758
4759    if (fci.params) {
4760        efree(fci.params);
4761    }
4762}
4763/* }}} */
4764
4765/* {{{ proto mixed call_user_func_array(string function_name, array parameters)
4766   Call a user function which is the first parameter with the arguments contained in array */
4767PHP_FUNCTION(call_user_func_array)
4768{
4769    zval *params, *retval_ptr = NULL;
4770    zend_fcall_info fci;
4771    zend_fcall_info_cache fci_cache;
4772
4773    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "fa/", &fci, &fci_cache, &params) == FAILURE) {
4774        return;
4775    }
4776
4777    zend_fcall_info_args(&fci, params TSRMLS_CC);
4778    fci.retval_ptr_ptr = &retval_ptr;
4779
4780    if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && fci.retval_ptr_ptr && *fci.retval_ptr_ptr) {
4781        COPY_PZVAL_TO_ZVAL(*return_value, *fci.retval_ptr_ptr);
4782    }
4783
4784    zend_fcall_info_args_clear(&fci, 1);
4785}
4786/* }}} */
4787
4788/* {{{ proto mixed call_user_method(string method_name, mixed object [, mixed parameter] [, mixed ...])
4789   Call a user method on a specific object or class */
4790PHP_FUNCTION(call_user_method)
4791{
4792    zval ***params = NULL;
4793    int n_params = 0;
4794    zval *retval_ptr;
4795    zval *callback, *object;
4796
4797    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/z*", &callback, &object, &params, &n_params) == FAILURE) {
4798        return;
4799    }
4800
4801    if (Z_TYPE_P(object) != IS_OBJECT &&
4802        Z_TYPE_P(object) != IS_STRING
4803    ) {
4804        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Second argument is not an object or class name");
4805        if (params) {
4806            efree(params);
4807        }
4808        RETURN_FALSE;
4809    }
4810
4811    convert_to_string(callback);
4812
4813    if (call_user_function_ex(EG(function_table), &object, callback, &retval_ptr, n_params, params, 0, NULL TSRMLS_CC) == SUCCESS) {
4814        if (retval_ptr) {
4815            COPY_PZVAL_TO_ZVAL(*return_value, retval_ptr);
4816        }
4817    } else {
4818        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %s()", Z_STRVAL_P(callback));
4819    }
4820    if (n_params) {
4821        efree(params);
4822    }
4823}
4824/* }}} */
4825
4826/* {{{ proto mixed call_user_method_array(string method_name, mixed object, array params)
4827   Call a user method on a specific object or class using a parameter array */
4828PHP_FUNCTION(call_user_method_array)
4829{
4830    zval *params, ***method_args = NULL, *retval_ptr;
4831    zval *callback, *object;
4832    HashTable *params_ar;
4833    int num_elems, element = 0;
4834
4835    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/zA/", &callback, &object, &params) == FAILURE) {
4836        return;
4837    }
4838
4839    if (Z_TYPE_P(object) != IS_OBJECT &&
4840        Z_TYPE_P(object) != IS_STRING
4841    ) {
4842        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Second argument is not an object or class name");
4843        RETURN_FALSE;
4844    }
4845
4846    convert_to_string(callback);
4847
4848    params_ar = HASH_OF(params);
4849    num_elems = zend_hash_num_elements(params_ar);
4850    method_args = (zval ***) safe_emalloc(sizeof(zval **), num_elems, 0);
4851
4852    for (zend_hash_internal_pointer_reset(params_ar);
4853        zend_hash_get_current_data(params_ar, (void **) &(method_args[element])) == SUCCESS;
4854        zend_hash_move_forward(params_ar)
4855    ) {
4856        element++;
4857    }
4858
4859    if (call_user_function_ex(EG(function_table), &object, callback, &retval_ptr, num_elems, method_args, 0, NULL TSRMLS_CC) == SUCCESS) {
4860        if (retval_ptr) {
4861            COPY_PZVAL_TO_ZVAL(*return_value, retval_ptr);
4862        }
4863    } else {
4864        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %s()", Z_STRVAL_P(callback));
4865    }
4866
4867    efree(method_args);
4868}
4869/* }}} */
4870
4871/* {{{ proto mixed forward_static_call(mixed function_name [, mixed parmeter] [, mixed ...]) U
4872   Call a user function which is the first parameter */
4873PHP_FUNCTION(forward_static_call)
4874{
4875    zval *retval_ptr = NULL;
4876    zend_fcall_info fci;
4877    zend_fcall_info_cache fci_cache;
4878
4879    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "f*", &fci, &fci_cache, &fci.params, &fci.param_count) == FAILURE) {
4880        return;
4881    }
4882
4883    if (!EG(active_op_array)->scope) {
4884        zend_error(E_ERROR, "Cannot call forward_static_call() when no class scope is active");
4885    }
4886
4887    fci.retval_ptr_ptr = &retval_ptr;
4888
4889    if (EG(called_scope) &&
4890        instanceof_function(EG(called_scope), fci_cache.calling_scope TSRMLS_CC)) {
4891            fci_cache.called_scope = EG(called_scope);
4892    }
4893
4894    if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && fci.retval_ptr_ptr && *fci.retval_ptr_ptr) {
4895        COPY_PZVAL_TO_ZVAL(*return_value, *fci.retval_ptr_ptr);
4896    }
4897
4898    if (fci.params) {
4899        efree(fci.params);
4900    }
4901}
4902/* }}} */
4903
4904/* {{{ proto mixed call_user_func_array(string function_name, array parameters) U
4905   Call a user function which is the first parameter with the arguments contained in array */
4906PHP_FUNCTION(forward_static_call_array)
4907{
4908    zval *params, *retval_ptr = NULL;
4909    zend_fcall_info fci;
4910    zend_fcall_info_cache fci_cache;
4911
4912    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "fa/", &fci, &fci_cache, &params) == FAILURE) {
4913        return;
4914    }
4915
4916    zend_fcall_info_args(&fci, params TSRMLS_CC);
4917    fci.retval_ptr_ptr = &retval_ptr;
4918
4919    if (EG(called_scope) &&
4920        instanceof_function(EG(called_scope), fci_cache.calling_scope TSRMLS_CC)) {
4921            fci_cache.called_scope = EG(called_scope);
4922    }
4923
4924    if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && fci.retval_ptr_ptr && *fci.retval_ptr_ptr) {
4925        COPY_PZVAL_TO_ZVAL(*return_value, *fci.retval_ptr_ptr);
4926    }
4927
4928    zend_fcall_info_args_clear(&fci, 1);
4929}
4930/* }}} */
4931
4932void user_shutdown_function_dtor(php_shutdown_function_entry *shutdown_function_entry) /* {{{ */
4933{
4934    int i;
4935
4936    for (i = 0; i < shutdown_function_entry->arg_count; i++) {
4937        zval_ptr_dtor(&shutdown_function_entry->arguments[i]);
4938    }
4939    efree(shutdown_function_entry->arguments);
4940}
4941/* }}} */
4942
4943void user_tick_function_dtor(user_tick_function_entry *tick_function_entry) /* {{{ */
4944{
4945    int i;
4946
4947    for (i = 0; i < tick_function_entry->arg_count; i++) {
4948        zval_ptr_dtor(&tick_function_entry->arguments[i]);
4949    }
4950    efree(tick_function_entry->arguments);
4951}
4952/* }}} */
4953
4954static int user_shutdown_function_call(php_shutdown_function_entry *shutdown_function_entry TSRMLS_DC) /* {{{ */
4955{
4956    zval retval;
4957    char *function_name;
4958
4959    if (!zend_is_callable(shutdown_function_entry->arguments[0], 0, &function_name TSRMLS_CC)) {
4960        php_error(E_WARNING, "(Registered shutdown functions) Unable to call %s() - function does not exist", function_name);
4961        if (function_name) {
4962            efree(function_name);
4963        }
4964        return 0;
4965    }
4966    if (function_name) {
4967        efree(function_name);
4968    }
4969
4970    if (call_user_function(EG(function_table), NULL,
4971                shutdown_function_entry->arguments[0],
4972                &retval,
4973                shutdown_function_entry->arg_count - 1,
4974                shutdown_function_entry->arguments + 1
4975                TSRMLS_CC ) == SUCCESS)
4976    {
4977        zval_dtor(&retval);
4978    }
4979    return 0;
4980}
4981/* }}} */
4982
4983static void user_tick_function_call(user_tick_function_entry *tick_fe TSRMLS_DC) /* {{{ */
4984{
4985    zval retval;
4986    zval *function = tick_fe->arguments[0];
4987
4988    /* Prevent reentrant calls to the same user ticks function */
4989    if (! tick_fe->calling) {
4990        tick_fe->calling = 1;
4991
4992        if (call_user_function( EG(function_table), NULL,
4993                                function,
4994                                &retval,
4995                                tick_fe->arg_count - 1,
4996                                tick_fe->arguments + 1
4997                                TSRMLS_CC) == SUCCESS) {
4998            zval_dtor(&retval);
4999
5000        } else {
5001            zval **obj, **method;
5002
5003            if (Z_TYPE_P(function) == IS_STRING) {
5004                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %s() - function does not exist", Z_STRVAL_P(function));
5005            } else if ( Z_TYPE_P(function) == IS_ARRAY
5006                        && zend_hash_index_find(Z_ARRVAL_P(function), 0, (void **) &obj) == SUCCESS
5007                        && zend_hash_index_find(Z_ARRVAL_P(function), 1, (void **) &method) == SUCCESS
5008                        && Z_TYPE_PP(obj) == IS_OBJECT
5009                        && Z_TYPE_PP(method) == IS_STRING) {
5010                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %s::%s() - function does not exist", Z_OBJCE_PP(obj)->name, Z_STRVAL_PP(method));
5011            } else {
5012                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call tick function");
5013            }
5014        }
5015
5016        tick_fe->calling = 0;
5017    }
5018}
5019/* }}} */
5020
5021static void run_user_tick_functions(int tick_count) /* {{{ */
5022{
5023    TSRMLS_FETCH();
5024
5025    zend_llist_apply(BG(user_tick_functions), (llist_apply_func_t) user_tick_function_call TSRMLS_CC);
5026}
5027/* }}} */
5028
5029static int user_tick_function_compare(user_tick_function_entry * tick_fe1, user_tick_function_entry * tick_fe2) /* {{{ */
5030{
5031    zval *func1 = tick_fe1->arguments[0];
5032    zval *func2 = tick_fe2->arguments[0];
5033    int ret;
5034    TSRMLS_FETCH();
5035
5036    if (Z_TYPE_P(func1) == IS_STRING && Z_TYPE_P(func2) == IS_STRING) {
5037        ret = (zend_binary_zval_strcmp(func1, func2) == 0);
5038    } else if (Z_TYPE_P(func1) == IS_ARRAY && Z_TYPE_P(func2) == IS_ARRAY) {
5039        zval result;
5040        zend_compare_arrays(&result, func1, func2 TSRMLS_CC);
5041        ret = (Z_LVAL(result) == 0);
5042    } else if (Z_TYPE_P(func1) == IS_OBJECT && Z_TYPE_P(func2) == IS_OBJECT) {
5043        zval result;
5044        zend_compare_objects(&result, func1, func2 TSRMLS_CC);
5045        ret = (Z_LVAL(result) == 0);
5046    } else {
5047        ret = 0;
5048    }
5049
5050    if (ret && tick_fe1->calling) {
5051        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to delete tick function executed at the moment");
5052        return 0;
5053    }
5054    return ret;
5055}
5056/* }}} */
5057
5058PHPAPI void php_call_shutdown_functions(TSRMLS_D) /* {{{ */
5059{
5060    if (BG(user_shutdown_function_names)) {
5061        zend_try {
5062            zend_hash_apply(BG(user_shutdown_function_names), (apply_func_t) user_shutdown_function_call TSRMLS_CC);
5063        }
5064        zend_end_try();
5065        php_free_shutdown_functions(TSRMLS_C);
5066    }
5067}
5068/* }}} */
5069
5070PHPAPI void php_free_shutdown_functions(TSRMLS_D) /* {{{ */
5071{
5072    if (BG(user_shutdown_function_names))
5073        zend_try {
5074            zend_hash_destroy(BG(user_shutdown_function_names));
5075            FREE_HASHTABLE(BG(user_shutdown_function_names));
5076            BG(user_shutdown_function_names) = NULL;
5077        } zend_catch {
5078            /* maybe shutdown method call exit, we just ignore it */
5079            FREE_HASHTABLE(BG(user_shutdown_function_names));
5080            BG(user_shutdown_function_names) = NULL;
5081        } zend_end_try();
5082}
5083/* }}} */
5084
5085/* {{{ proto void register_shutdown_function(callback function) U
5086   Register a user-level function to be called on request termination */
5087PHP_FUNCTION(register_shutdown_function)
5088{
5089    php_shutdown_function_entry shutdown_function_entry;
5090    char *callback_name = NULL;
5091    int i;
5092
5093    shutdown_function_entry.arg_count = ZEND_NUM_ARGS();
5094
5095    if (shutdown_function_entry.arg_count < 1) {
5096        WRONG_PARAM_COUNT;
5097    }
5098
5099    shutdown_function_entry.arguments = (zval **) safe_emalloc(sizeof(zval *), shutdown_function_entry.arg_count, 0);
5100
5101    if (zend_get_parameters_array(ht, shutdown_function_entry.arg_count, shutdown_function_entry.arguments) == FAILURE) {
5102        efree(shutdown_function_entry.arguments);
5103        RETURN_FALSE;
5104    }
5105
5106    /* Prevent entering of anything but valid callback (syntax check only!) */
5107    if (!zend_is_callable(shutdown_function_entry.arguments[0], 0, &callback_name TSRMLS_CC)) {
5108        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid shutdown callback '%s' passed", callback_name);
5109        efree(shutdown_function_entry.arguments);
5110        RETVAL_FALSE;
5111    } else {
5112        if (!BG(user_shutdown_function_names)) {
5113            ALLOC_HASHTABLE(BG(user_shutdown_function_names));
5114            zend_hash_init(BG(user_shutdown_function_names), 0, NULL, (void (*)(void *)) user_shutdown_function_dtor, 0);
5115        }
5116
5117        for (i = 0; i < shutdown_function_entry.arg_count; i++) {
5118            Z_ADDREF_P(shutdown_function_entry.arguments[i]);
5119        }
5120        zend_hash_next_index_insert(BG(user_shutdown_function_names), &shutdown_function_entry, sizeof(php_shutdown_function_entry), NULL);
5121    }
5122    if (callback_name) {
5123        efree(callback_name);
5124    }
5125}
5126/* }}} */
5127
5128PHPAPI zend_bool register_user_shutdown_function(char *function_name, size_t function_len, php_shutdown_function_entry *shutdown_function_entry TSRMLS_DC) /* {{{ */
5129{
5130    if (!BG(user_shutdown_function_names)) {
5131        ALLOC_HASHTABLE(BG(user_shutdown_function_names));
5132        zend_hash_init(BG(user_shutdown_function_names), 0, NULL, (void (*)(void *)) user_shutdown_function_dtor, 0);
5133    }
5134
5135    return zend_hash_update(BG(user_shutdown_function_names), function_name, function_len, shutdown_function_entry, sizeof(php_shutdown_function_entry), NULL) != FAILURE;
5136}
5137/* }}} */
5138
5139PHPAPI zend_bool remove_user_shutdown_function(char *function_name, size_t function_len TSRMLS_DC) /* {{{ */
5140{
5141    if (BG(user_shutdown_function_names)) {
5142        return zend_hash_del_key_or_index(BG(user_shutdown_function_names), function_name, function_len, 0, HASH_DEL_KEY) != FAILURE;
5143    }
5144
5145    return 0;
5146}
5147/* }}} */
5148
5149PHPAPI zend_bool append_user_shutdown_function(php_shutdown_function_entry shutdown_function_entry TSRMLS_DC) /* {{{ */
5150{
5151    if (!BG(user_shutdown_function_names)) {
5152        ALLOC_HASHTABLE(BG(user_shutdown_function_names));
5153        zend_hash_init(BG(user_shutdown_function_names), 0, NULL, (void (*)(void *)) user_shutdown_function_dtor, 0);
5154    }
5155
5156    return zend_hash_next_index_insert(BG(user_shutdown_function_names), &shutdown_function_entry, sizeof(php_shutdown_function_entry), NULL) != FAILURE;
5157}
5158/* }}} */
5159
5160ZEND_API void php_get_highlight_struct(zend_syntax_highlighter_ini *syntax_highlighter_ini) /* {{{ */
5161{
5162    syntax_highlighter_ini->highlight_comment = INI_STR("highlight.comment");
5163    syntax_highlighter_ini->highlight_default = INI_STR("highlight.default");
5164    syntax_highlighter_ini->highlight_html    = INI_STR("highlight.html");
5165    syntax_highlighter_ini->highlight_keyword = INI_STR("highlight.keyword");
5166    syntax_highlighter_ini->highlight_string  = INI_STR("highlight.string");
5167}
5168/* }}} */
5169
5170/* {{{ proto bool highlight_file(string file_name [, bool return] )
5171   Syntax highlight a source file */
5172PHP_FUNCTION(highlight_file)
5173{
5174    char *filename;
5175    int filename_len, ret;
5176    zend_syntax_highlighter_ini syntax_highlighter_ini;
5177    zend_bool i = 0;
5178
5179    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|b", &filename, &filename_len, &i) == FAILURE) {
5180        RETURN_FALSE;
5181    }
5182
5183    if (php_check_open_basedir(filename TSRMLS_CC)) {
5184        RETURN_FALSE;
5185    }
5186
5187    if (i) {
5188        php_output_start_default(TSRMLS_C);
5189    }
5190
5191    php_get_highlight_struct(&syntax_highlighter_ini);
5192
5193    ret = highlight_file(filename, &syntax_highlighter_ini TSRMLS_CC);
5194
5195    if (ret == FAILURE) {
5196        if (i) {
5197            php_output_end(TSRMLS_C);
5198        }
5199        RETURN_FALSE;
5200    }
5201
5202    if (i) {
5203        php_output_get_contents(return_value TSRMLS_CC);
5204        php_output_discard(TSRMLS_C);
5205    } else {
5206        RETURN_TRUE;
5207    }
5208}
5209/* }}} */
5210
5211/* {{{ proto string php_strip_whitespace(string file_name)
5212   Return source with stripped comments and whitespace */
5213PHP_FUNCTION(php_strip_whitespace)
5214{
5215    char *filename;
5216    int filename_len;
5217    zend_lex_state original_lex_state;
5218    zend_file_handle file_handle = {0};
5219
5220    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &filename, &filename_len) == FAILURE) {
5221        RETURN_FALSE;
5222    }
5223
5224    php_output_start_default(TSRMLS_C);
5225
5226    file_handle.type = ZEND_HANDLE_FILENAME;
5227    file_handle.filename = filename;
5228    file_handle.free_filename = 0;
5229    file_handle.opened_path = NULL;
5230    zend_save_lexical_state(&original_lex_state TSRMLS_CC);
5231    if (open_file_for_scanning(&file_handle TSRMLS_CC) == FAILURE) {
5232        zend_restore_lexical_state(&original_lex_state TSRMLS_CC);
5233        php_output_end(TSRMLS_C);
5234        RETURN_EMPTY_STRING();
5235    }
5236
5237    zend_strip(TSRMLS_C);
5238
5239    zend_destroy_file_handle(&file_handle TSRMLS_CC);
5240    zend_restore_lexical_state(&original_lex_state TSRMLS_CC);
5241
5242    php_output_get_contents(return_value TSRMLS_CC);
5243    php_output_discard(TSRMLS_C);
5244}
5245/* }}} */
5246
5247/* {{{ proto bool highlight_string(string string [, bool return] )
5248   Syntax highlight a string or optionally return it */
5249PHP_FUNCTION(highlight_string)
5250{
5251    zval **expr;
5252    zend_syntax_highlighter_ini syntax_highlighter_ini;
5253    char *hicompiled_string_description;
5254    zend_bool i = 0;
5255    int old_error_reporting = EG(error_reporting);
5256
5257    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|b", &expr, &i) == FAILURE) {
5258        RETURN_FALSE;
5259    }
5260    convert_to_string_ex(expr);
5261
5262    if (i) {
5263        php_output_start_default(TSRMLS_C);
5264    }
5265
5266    EG(error_reporting) = E_ERROR;
5267
5268    php_get_highlight_struct(&syntax_highlighter_ini);
5269
5270    hicompiled_string_description = zend_make_compiled_string_description("highlighted code" TSRMLS_CC);
5271
5272    if (highlight_string(*expr, &syntax_highlighter_ini, hicompiled_string_description TSRMLS_CC) == FAILURE) {
5273        efree(hicompiled_string_description);
5274        EG(error_reporting) = old_error_reporting;
5275        if (i) {
5276            php_output_end(TSRMLS_C);
5277        }
5278        RETURN_FALSE;
5279    }
5280    efree(hicompiled_string_description);
5281
5282    EG(error_reporting) = old_error_reporting;
5283
5284    if (i) {
5285        php_output_get_contents(return_value TSRMLS_CC);
5286        php_output_discard(TSRMLS_C);
5287    } else {
5288        RETURN_TRUE;
5289    }
5290}
5291/* }}} */
5292
5293/* {{{ proto string ini_get(string varname)
5294   Get a configuration option */
5295PHP_FUNCTION(ini_get)
5296{
5297    char *varname, *str;
5298    int varname_len;
5299
5300    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &varname, &varname_len) == FAILURE) {
5301        return;
5302    }
5303
5304    str = zend_ini_string(varname, varname_len + 1, 0);
5305
5306    if (!str) {
5307        RETURN_FALSE;
5308    }
5309
5310    RETURN_STRING(str, 1);
5311}
5312/* }}} */
5313
5314static int php_ini_get_option(zend_ini_entry *ini_entry TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */
5315{
5316    zval *ini_array = va_arg(args, zval *);
5317    int module_number = va_arg(args, int);
5318    int details = va_arg(args, int);
5319    zval *option;
5320
5321    if (module_number != 0 && ini_entry->module_number != module_number) {
5322        return 0;
5323    }
5324
5325    if (hash_key->nKeyLength == 0 ||
5326        hash_key->arKey[0] != 0
5327    ) {
5328        if (details) {
5329            MAKE_STD_ZVAL(option);
5330            array_init(option);
5331
5332            if (ini_entry->orig_value) {
5333                add_assoc_stringl(option, "global_value", ini_entry->orig_value, ini_entry->orig_value_length, 1);
5334            } else if (ini_entry->value) {
5335                add_assoc_stringl(option, "global_value", ini_entry->value, ini_entry->value_length, 1);
5336            } else {
5337                add_assoc_null(option, "global_value");
5338            }
5339
5340            if (ini_entry->value) {
5341                add_assoc_stringl(option, "local_value", ini_entry->value, ini_entry->value_length, 1);
5342            } else {
5343                add_assoc_null(option, "local_value");
5344            }
5345
5346            add_assoc_long(option, "access", ini_entry->modifiable);
5347
5348            add_assoc_zval_ex(ini_array, ini_entry->name, ini_entry->name_length, option);
5349        } else {
5350            if (ini_entry->value) {
5351                add_assoc_stringl(ini_array, ini_entry->name, ini_entry->value, ini_entry->value_length, 1);
5352            } else {
5353                add_assoc_null(ini_array, ini_entry->name);
5354            }
5355        }
5356    }
5357    return 0;
5358}
5359/* }}} */
5360
5361/* {{{ proto array ini_get_all([string extension[, bool details = true]])
5362   Get all configuration options */
5363PHP_FUNCTION(ini_get_all)
5364{
5365    char *extname = NULL;
5366    int extname_len = 0, extnumber = 0;
5367    zend_module_entry *module;
5368    zend_bool details = 1;
5369
5370    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!b", &extname, &extname_len, &details) == FAILURE) {
5371        return;
5372    }
5373
5374    zend_ini_sort_entries(TSRMLS_C);
5375
5376    if (extname) {
5377        if (zend_hash_find(&module_registry, extname, extname_len+1, (void **) &module) == FAILURE) {
5378            php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find extension '%s'", extname);
5379            RETURN_FALSE;
5380        }
5381        extnumber = module->module_number;
5382    }
5383
5384    array_init(return_value);
5385    zend_hash_apply_with_arguments(EG(ini_directives) TSRMLS_CC, (apply_func_args_t) php_ini_get_option, 2, return_value, extnumber, details);
5386}
5387/* }}} */
5388
5389static int php_ini_check_path(char *option_name, int option_len, char *new_option_name, int new_option_len) /* {{{ */
5390{
5391    if (option_len != (new_option_len - 1)) {
5392        return 0;
5393    }
5394
5395    return !strncmp(option_name, new_option_name, option_len);
5396}
5397/* }}} */
5398
5399/* {{{ proto string ini_set(string varname, string newvalue)
5400   Set a configuration option, returns false on error and the old value of the configuration option on success */
5401PHP_FUNCTION(ini_set)
5402{
5403    char *varname, *new_value;
5404    int varname_len, new_value_len;
5405    char *old_value;
5406
5407    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &varname, &varname_len, &new_value, &new_value_len) == FAILURE) {
5408        return;
5409    }
5410
5411    old_value = zend_ini_string(varname, varname_len + 1, 0);
5412
5413    /* copy to return here, because alter might free it! */
5414    if (old_value) {
5415        RETVAL_STRING(old_value, 1);
5416    } else {
5417        RETVAL_FALSE;
5418    }
5419
5420#define _CHECK_PATH(var, var_len, ini) php_ini_check_path(var, var_len, ini, sizeof(ini))
5421    /* open basedir check */
5422    if (PG(open_basedir)) {
5423        if (_CHECK_PATH(varname, varname_len, "error_log") ||
5424            _CHECK_PATH(varname, varname_len, "java.class.path") ||
5425            _CHECK_PATH(varname, varname_len, "java.home") ||
5426            _CHECK_PATH(varname, varname_len, "mail.log") ||
5427            _CHECK_PATH(varname, varname_len, "java.library.path") ||
5428            _CHECK_PATH(varname, varname_len, "vpopmail.directory")) {
5429            if (php_check_open_basedir(new_value TSRMLS_CC)) {
5430                zval_dtor(return_value);
5431                RETURN_FALSE;
5432            }
5433        }
5434    }
5435
5436    if (zend_alter_ini_entry_ex(varname, varname_len + 1, new_value, new_value_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC) == FAILURE) {
5437        zval_dtor(return_value);
5438        RETURN_FALSE;
5439    }
5440}
5441/* }}} */
5442
5443/* {{{ proto void ini_restore(string varname)
5444   Restore the value of a configuration option specified by varname */
5445PHP_FUNCTION(ini_restore)
5446{
5447    char *varname;
5448    int varname_len;
5449
5450    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &varname, &varname_len) == FAILURE) {
5451        return;
5452    }
5453
5454    zend_restore_ini_entry(varname, varname_len+1, PHP_INI_STAGE_RUNTIME);
5455}
5456/* }}} */
5457
5458/* {{{ proto string set_include_path(string new_include_path)
5459   Sets the include_path configuration option */
5460PHP_FUNCTION(set_include_path)
5461{
5462    char *new_value;
5463    int new_value_len;
5464    char *old_value;
5465
5466    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &new_value, &new_value_len) == FAILURE) {
5467        return;
5468    }
5469
5470    old_value = zend_ini_string("include_path", sizeof("include_path"), 0);
5471    /* copy to return here, because alter might free it! */
5472    if (old_value) {
5473        RETVAL_STRING(old_value, 1);
5474    } else {
5475        RETVAL_FALSE;
5476    }
5477
5478    if (zend_alter_ini_entry_ex("include_path", sizeof("include_path"), new_value, new_value_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC) == FAILURE) {
5479        zval_dtor(return_value);
5480        RETURN_FALSE;
5481    }
5482}
5483/* }}} */
5484
5485/* {{{ proto string get_include_path()
5486   Get the current include_path configuration option */
5487PHP_FUNCTION(get_include_path)
5488{
5489    char *str;
5490
5491    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) {
5492        return;
5493    }
5494
5495    str = zend_ini_string("include_path", sizeof("include_path"), 0);
5496
5497    if (str == NULL) {
5498        RETURN_FALSE;
5499    }
5500
5501    RETURN_STRING(str, 1);
5502}
5503/* }}} */
5504
5505/* {{{ proto void restore_include_path()
5506   Restore the value of the include_path configuration option */
5507PHP_FUNCTION(restore_include_path)
5508{
5509    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) {
5510        return;
5511    }
5512    zend_restore_ini_entry("include_path", sizeof("include_path"), PHP_INI_STAGE_RUNTIME);
5513}
5514/* }}} */
5515
5516/* {{{ proto mixed print_r(mixed var [, bool return])
5517   Prints out or returns information about the specified variable */
5518PHP_FUNCTION(print_r)
5519{
5520    zval *var;
5521    zend_bool do_return = 0;
5522
5523    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b", &var, &do_return) == FAILURE) {
5524        RETURN_FALSE;
5525    }
5526
5527    if (do_return) {
5528        php_output_start_default(TSRMLS_C);
5529    }
5530
5531    zend_print_zval_r(var, 0 TSRMLS_CC);
5532
5533    if (do_return) {
5534        php_output_get_contents(return_value TSRMLS_CC);
5535        php_output_discard(TSRMLS_C);
5536    } else {
5537        RETURN_TRUE;
5538    }
5539}
5540/* }}} */
5541
5542/* {{{ proto int connection_aborted(void)
5543   Returns true if client disconnected */
5544PHP_FUNCTION(connection_aborted)
5545{
5546    RETURN_LONG(PG(connection_status) & PHP_CONNECTION_ABORTED);
5547}
5548/* }}} */
5549
5550/* {{{ proto int connection_status(void)
5551   Returns the connection status bitfield */
5552PHP_FUNCTION(connection_status)
5553{
5554    RETURN_LONG(PG(connection_status));
5555}
5556/* }}} */
5557
5558/* {{{ proto int ignore_user_abort([string value])
5559   Set whether we want to ignore a user abort event or not */
5560PHP_FUNCTION(ignore_user_abort)
5561{
5562    char *arg = NULL;
5563    int arg_len = 0;
5564    int old_setting;
5565
5566    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &arg, &arg_len) == FAILURE) {
5567        return;
5568    }
5569
5570    old_setting = PG(ignore_user_abort);
5571
5572    if (arg) {
5573        zend_alter_ini_entry_ex("ignore_user_abort", sizeof("ignore_user_abort"), arg, arg_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC);
5574    }
5575
5576    RETURN_LONG(old_setting);
5577}
5578/* }}} */
5579
5580#if HAVE_GETSERVBYNAME
5581/* {{{ proto int getservbyname(string service, string protocol)
5582   Returns port associated with service. Protocol must be "tcp" or "udp" */
5583PHP_FUNCTION(getservbyname)
5584{
5585    char *name, *proto;
5586    int name_len, proto_len;
5587    struct servent *serv;
5588
5589    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &name, &name_len, &proto, &proto_len) == FAILURE) {
5590        return;
5591    }
5592
5593
5594/* empty string behaves like NULL on windows implementation of
5595   getservbyname. Let be portable instead. */
5596#ifdef PHP_WIN32
5597    if (proto_len == 0) {
5598        RETURN_FALSE;
5599    }
5600#endif
5601
5602    serv = getservbyname(name, proto);
5603
5604    if (serv == NULL) {
5605        RETURN_FALSE;
5606    }
5607
5608    RETURN_LONG(ntohs(serv->s_port));
5609}
5610/* }}} */
5611#endif
5612
5613#if HAVE_GETSERVBYPORT
5614/* {{{ proto string getservbyport(int port, string protocol)
5615   Returns service name associated with port. Protocol must be "tcp" or "udp" */
5616PHP_FUNCTION(getservbyport)
5617{
5618    char *proto;
5619    int proto_len;
5620    long port;
5621    struct servent *serv;
5622
5623    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &port, &proto, &proto_len) == FAILURE) {
5624        return;
5625    }
5626
5627    serv = getservbyport(htons((unsigned short) port), proto);
5628
5629    if (serv == NULL) {
5630        RETURN_FALSE;
5631    }
5632
5633    RETURN_STRING(serv->s_name, 1);
5634}
5635/* }}} */
5636#endif
5637
5638#if HAVE_GETPROTOBYNAME
5639/* {{{ proto int getprotobyname(string name)
5640   Returns protocol number associated with name as per /etc/protocols */
5641PHP_FUNCTION(getprotobyname)
5642{
5643    char *name;
5644    int name_len;
5645    struct protoent *ent;
5646
5647    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
5648        return;
5649    }
5650
5651    ent = getprotobyname(name);
5652
5653    if (ent == NULL) {
5654        RETURN_FALSE;
5655    }
5656
5657    RETURN_LONG(ent->p_proto);
5658}
5659/* }}} */
5660#endif
5661
5662#if HAVE_GETPROTOBYNUMBER
5663/* {{{ proto string getprotobynumber(int proto)
5664   Returns protocol name associated with protocol number proto */
5665PHP_FUNCTION(getprotobynumber)
5666{
5667    long proto;
5668    struct protoent *ent;
5669
5670    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &proto) == FAILURE) {
5671        return;
5672    }
5673
5674    ent = getprotobynumber(proto);
5675
5676    if (ent == NULL) {
5677        RETURN_FALSE;
5678    }
5679
5680    RETURN_STRING(ent->p_name, 1);
5681}
5682/* }}} */
5683#endif
5684
5685/* {{{ proto bool register_tick_function(string function_name [, mixed arg [, mixed ... ]])
5686   Registers a tick callback function */
5687PHP_FUNCTION(register_tick_function)
5688{
5689    user_tick_function_entry tick_fe;
5690    int i;
5691    char *function_name = NULL;
5692
5693    tick_fe.calling = 0;
5694    tick_fe.arg_count = ZEND_NUM_ARGS();
5695
5696    if (tick_fe.arg_count < 1) {
5697        WRONG_PARAM_COUNT;
5698    }
5699
5700    tick_fe.arguments = (zval **) safe_emalloc(sizeof(zval *), tick_fe.arg_count, 0);
5701
5702    if (zend_get_parameters_array(ht, tick_fe.arg_count, tick_fe.arguments) == FAILURE) {
5703        efree(tick_fe.arguments);
5704        RETURN_FALSE;
5705    }
5706
5707    if (!zend_is_callable(tick_fe.arguments[0], 0, &function_name TSRMLS_CC)) {
5708        efree(tick_fe.arguments);
5709        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid tick callback '%s' passed", function_name);
5710        efree(function_name);
5711        RETURN_FALSE;
5712    } else if (function_name) {
5713        efree(function_name);
5714    }
5715
5716    if (Z_TYPE_P(tick_fe.arguments[0]) != IS_ARRAY && Z_TYPE_P(tick_fe.arguments[0]) != IS_OBJECT) {
5717        convert_to_string_ex(&tick_fe.arguments[0]);
5718    }
5719
5720    if (!BG(user_tick_functions)) {
5721        BG(user_tick_functions) = (zend_llist *) emalloc(sizeof(zend_llist));
5722        zend_llist_init(BG(user_tick_functions),
5723                        sizeof(user_tick_function_entry),
5724                        (llist_dtor_func_t) user_tick_function_dtor, 0);
5725        php_add_tick_function(run_user_tick_functions);
5726    }
5727
5728    for (i = 0; i < tick_fe.arg_count; i++) {
5729        Z_ADDREF_P(tick_fe.arguments[i]);
5730    }
5731
5732    zend_llist_add_element(BG(user_tick_functions), &tick_fe);
5733
5734    RETURN_TRUE;
5735}
5736/* }}} */
5737
5738/* {{{ proto void unregister_tick_function(string function_name)
5739   Unregisters a tick callback function */
5740PHP_FUNCTION(unregister_tick_function)
5741{
5742    zval *function;
5743    user_tick_function_entry tick_fe;
5744
5745    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &function) == FAILURE) {
5746        return;
5747    }
5748
5749    if (!BG(user_tick_functions)) {
5750        return;
5751    }
5752
5753    if (Z_TYPE_P(function) != IS_ARRAY && Z_TYPE_P(function) != IS_OBJECT) {
5754        convert_to_string(function);
5755    }
5756
5757    tick_fe.arguments = (zval **) emalloc(sizeof(zval *));
5758    tick_fe.arguments[0] = function;
5759    tick_fe.arg_count = 1;
5760    zend_llist_del_element(BG(user_tick_functions), &tick_fe, (int (*)(void *, void *)) user_tick_function_compare);
5761    efree(tick_fe.arguments);
5762}
5763/* }}} */
5764
5765/* {{{ proto bool is_uploaded_file(string path)
5766   Check if file was created by rfc1867 upload */
5767PHP_FUNCTION(is_uploaded_file)
5768{
5769    char *path;
5770    int path_len;
5771
5772    if (!SG(rfc1867_uploaded_files)) {
5773        RETURN_FALSE;
5774    }
5775
5776    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &path, &path_len) == FAILURE) {
5777        return;
5778    }
5779
5780    if (zend_hash_exists(SG(rfc1867_uploaded_files), path, path_len + 1)) {
5781        RETURN_TRUE;
5782    } else {
5783        RETURN_FALSE;
5784    }
5785}
5786/* }}} */
5787
5788/* {{{ proto bool move_uploaded_file(string path, string new_path)
5789   Move a file if and only if it was created by an upload */
5790PHP_FUNCTION(move_uploaded_file)
5791{
5792    char *path, *new_path;
5793    int path_len, new_path_len;
5794    zend_bool successful = 0;
5795
5796#ifndef PHP_WIN32
5797    int oldmask; int ret;
5798#endif
5799
5800    if (!SG(rfc1867_uploaded_files)) {
5801        RETURN_FALSE;
5802    }
5803
5804    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &path, &path_len, &new_path, &new_path_len) == FAILURE) {
5805        return;
5806    }
5807
5808    if (!zend_hash_exists(SG(rfc1867_uploaded_files), path, path_len + 1)) {
5809        RETURN_FALSE;
5810    }
5811
5812    if (php_check_open_basedir(new_path TSRMLS_CC)) {
5813        RETURN_FALSE;
5814    }
5815
5816    if (VCWD_RENAME(path, new_path) == 0) {
5817        successful = 1;
5818#ifndef PHP_WIN32
5819        oldmask = umask(077);
5820        umask(oldmask);
5821
5822        ret = VCWD_CHMOD(new_path, 0666 & ~oldmask);
5823
5824        if (ret == -1) {
5825            php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
5826        }
5827#endif
5828    } else if (php_copy_file_ex(path, new_path, STREAM_DISABLE_OPEN_BASEDIR TSRMLS_CC) == SUCCESS) {
5829        VCWD_UNLINK(path);
5830        successful = 1;
5831    }
5832
5833    if (successful) {
5834        zend_hash_del(SG(rfc1867_uploaded_files), path, path_len + 1);
5835    } else {
5836        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to move '%s' to '%s'", path, new_path);
5837    }
5838
5839    RETURN_BOOL(successful);
5840}
5841/* }}} */
5842
5843/* {{{ php_simple_ini_parser_cb
5844 */
5845static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callback_type, zval *arr TSRMLS_DC)
5846{
5847    zval *element;
5848
5849    switch (callback_type) {
5850
5851        case ZEND_INI_PARSER_ENTRY:
5852            if (!arg2) {
5853                /* bare string - nothing to do */
5854                break;
5855            }
5856            ALLOC_ZVAL(element);
5857            MAKE_COPY_ZVAL(&arg2, element);
5858            zend_symtable_update(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) + 1, &element, sizeof(zval *), NULL);
5859            break;
5860
5861        case ZEND_INI_PARSER_POP_ENTRY:
5862        {
5863            zval *hash, **find_hash;
5864
5865            if (!arg2) {
5866                /* bare string - nothing to do */
5867                break;
5868            }
5869
5870            if (!(Z_STRLEN_P(arg1) > 1 && Z_STRVAL_P(arg1)[0] == '0') && is_numeric_string(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1), NULL, NULL, 0) == IS_LONG) {
5871                ulong key = (ulong) zend_atol(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1));
5872                if (zend_hash_index_find(Z_ARRVAL_P(arr), key, (void **) &find_hash) == FAILURE) {
5873                    ALLOC_ZVAL(hash);
5874                    INIT_PZVAL(hash);
5875                    array_init(hash);
5876
5877                    zend_hash_index_update(Z_ARRVAL_P(arr), key, &hash, sizeof(zval *), NULL);
5878                } else {
5879                    hash = *find_hash;
5880                }
5881            } else {
5882                if (zend_hash_find(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) + 1, (void **) &find_hash) == FAILURE) {
5883                    ALLOC_ZVAL(hash);
5884                    INIT_PZVAL(hash);
5885                    array_init(hash);
5886
5887                    zend_hash_update(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) + 1, &hash, sizeof(zval *), NULL);
5888                } else {
5889                    hash = *find_hash;
5890                }
5891            }
5892
5893            if (Z_TYPE_P(hash) != IS_ARRAY) {
5894                zval_dtor(hash);
5895                INIT_PZVAL(hash);
5896                array_init(hash);
5897            }
5898
5899            ALLOC_ZVAL(element);
5900            MAKE_COPY_ZVAL(&arg2, element);
5901
5902            if (arg3 && Z_STRLEN_P(arg3) > 0) {
5903                add_assoc_zval_ex(hash, Z_STRVAL_P(arg3), Z_STRLEN_P(arg3) + 1, element);
5904            } else {
5905                add_next_index_zval(hash, element);
5906            }
5907        }
5908        break;
5909
5910        case ZEND_INI_PARSER_SECTION:
5911            break;
5912    }
5913}
5914/* }}} */
5915
5916/* {{{ php_ini_parser_cb_with_sections
5917 */
5918static void php_ini_parser_cb_with_sections(zval *arg1, zval *arg2, zval *arg3, int callback_type, zval *arr TSRMLS_DC)
5919{
5920    if (callback_type == ZEND_INI_PARSER_SECTION) {
5921        MAKE_STD_ZVAL(BG(active_ini_file_section));
5922        array_init(BG(active_ini_file_section));
5923        zend_symtable_update(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) + 1, &BG(active_ini_file_section), sizeof(zval *), NULL);
5924    } else if (arg2) {
5925        zval *active_arr;
5926
5927        if (BG(active_ini_file_section)) {
5928            active_arr = BG(active_ini_file_section);
5929        } else {
5930            active_arr = arr;
5931        }
5932
5933        php_simple_ini_parser_cb(arg1, arg2, arg3, callback_type, active_arr TSRMLS_CC);
5934    }
5935}
5936/* }}} */
5937
5938/* {{{ proto array parse_ini_file(string filename [, bool process_sections [, int scanner_mode]])
5939   Parse configuration file */
5940PHP_FUNCTION(parse_ini_file)
5941{
5942    char *filename = NULL;
5943    int filename_len = 0;
5944    zend_bool process_sections = 0;
5945    long scanner_mode = ZEND_INI_SCANNER_NORMAL;
5946    zend_file_handle fh;
5947    zend_ini_parser_cb_t ini_parser_cb;
5948
5949    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|bl", &filename, &filename_len, &process_sections, &scanner_mode) == FAILURE) {
5950        RETURN_FALSE;
5951    }
5952
5953    if (filename_len == 0) {
5954        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Filename cannot be empty!");
5955        RETURN_FALSE;
5956    }
5957
5958    /* Set callback function */
5959    if (process_sections) {
5960        BG(active_ini_file_section) = NULL;
5961        ini_parser_cb = (zend_ini_parser_cb_t) php_ini_parser_cb_with_sections;
5962    } else {
5963        ini_parser_cb = (zend_ini_parser_cb_t) php_simple_ini_parser_cb;
5964    }
5965
5966    /* Setup filehandle */
5967    memset(&fh, 0, sizeof(fh));
5968    fh.filename = filename;
5969    fh.type = ZEND_HANDLE_FILENAME;
5970
5971    array_init(return_value);
5972    if (zend_parse_ini_file(&fh, 0, scanner_mode, ini_parser_cb, return_value TSRMLS_CC) == FAILURE) {
5973        zend_hash_destroy(Z_ARRVAL_P(return_value));
5974        efree(Z_ARRVAL_P(return_value));
5975        RETURN_FALSE;
5976    }
5977}
5978/* }}} */
5979
5980/* {{{ proto array parse_ini_string(string ini_string [, bool process_sections [, int scanner_mode]])
5981   Parse configuration string */
5982PHP_FUNCTION(parse_ini_string)
5983{
5984    char *string = NULL, *str = NULL;
5985    int str_len = 0;
5986    zend_bool process_sections = 0;
5987    long scanner_mode = ZEND_INI_SCANNER_NORMAL;
5988    zend_ini_parser_cb_t ini_parser_cb;
5989
5990    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|bl", &str, &str_len, &process_sections, &scanner_mode) == FAILURE) {
5991        RETURN_FALSE;
5992    }
5993
5994    if (INT_MAX - str_len < ZEND_MMAP_AHEAD) {
5995        RETVAL_FALSE;
5996    }
5997
5998    /* Set callback function */
5999    if (process_sections) {
6000        BG(active_ini_file_section) = NULL;
6001        ini_parser_cb = (zend_ini_parser_cb_t) php_ini_parser_cb_with_sections;
6002    } else {
6003        ini_parser_cb = (zend_ini_parser_cb_t) php_simple_ini_parser_cb;
6004    }
6005
6006    /* Setup string */
6007    string = (char *) emalloc(str_len + ZEND_MMAP_AHEAD);
6008    memcpy(string, str, str_len);
6009    memset(string + str_len, 0, ZEND_MMAP_AHEAD);
6010
6011    array_init(return_value);
6012    if (zend_parse_ini_string(string, 0, scanner_mode, ini_parser_cb, return_value TSRMLS_CC) == FAILURE) {
6013        zend_hash_destroy(Z_ARRVAL_P(return_value));
6014        efree(Z_ARRVAL_P(return_value));
6015        RETVAL_FALSE;
6016    }
6017    efree(string);
6018}
6019/* }}} */
6020
6021#if ZEND_DEBUG
6022/* This function returns an array of ALL valid ini options with values and
6023 *  is not the same as ini_get_all() which returns only registered ini options. Only useful for devs to debug php.ini scanner/parser! */
6024PHP_FUNCTION(config_get_hash) /* {{{ */
6025{
6026    HashTable *hash = php_ini_get_configuration_hash();
6027
6028    array_init(return_value);
6029    zend_hash_apply_with_arguments(hash TSRMLS_CC, (apply_func_args_t) add_config_entry_cb, 1, return_value);
6030}
6031/* }}} */
6032#endif
6033
6034#ifdef HAVE_GETLOADAVG
6035/* {{{ proto array sys_getloadavg()
6036*/
6037PHP_FUNCTION(sys_getloadavg)
6038{
6039    double load[3];
6040
6041    if (zend_parse_parameters_none() == FAILURE) {
6042        return;
6043    }
6044
6045    if (getloadavg(load, 3) == -1) {
6046        RETURN_FALSE;
6047    } else {
6048        array_init(return_value);
6049        add_index_double(return_value, 0, load[0]);
6050        add_index_double(return_value, 1, load[1]);
6051        add_index_double(return_value, 2, load[2]);
6052    }
6053}
6054/* }}} */
6055#endif
6056
6057/*
6058 * Local variables:
6059 * tab-width: 4
6060 * c-basic-offset: 4
6061 * End:
6062 * vim600: fdm=marker
6063 * vim: noet sw=4 ts=4
6064 */
6065