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