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