jon Sun Sep 29 23:02:52 2002 EDT
Modified files:
/php4/ext/standard basic_functions.c basic_functions.h
Log:
@ - Added getopt() for parsing command line options and arguments. (Jon)
Index: php4/ext/standard/basic_functions.c
diff -u php4/ext/standard/basic_functions.c:1.515
php4/ext/standard/basic_functions.c:1.516
--- php4/ext/standard/basic_functions.c:1.515 Sat Sep 28 18:14:20 2002
+++ php4/ext/standard/basic_functions.c Sun Sep 29 23:02:51 2002
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: basic_functions.c,v 1.515 2002/09/28 22:14:20 wez Exp $ */
+/* $Id: basic_functions.c,v 1.516 2002/09/30 03:02:51 jon Exp $ */
#include "php.h"
#include "php_streams.h"
@@ -498,6 +498,10 @@
PHP_FE(putenv,
NULL)
#endif
+#ifdef HAVE_GETOPT
+ PHP_FE(getopt,
+ NULL)
+#endif
+
PHP_FE(microtime,
NULL)
PHP_FE(gettimeofday,
NULL)
@@ -1337,6 +1341,105 @@
RETURN_FALSE;
}
}
+}
+/* }}} */
+#endif
+
+#ifdef HAVE_GETOPT
+/* {{{ free_argv
+ Free the memory allocated to an argv array. */
+static void free_argv(char **argv, int argc)
+{
+ int i;
+
+ if (argv) {
+ for (i = 0; i < argc; i++) {
+ if (argv[i]) {
+ efree(argv[i]);
+ }
+ }
+ efree(argv);
+ }
+}
+/* }}} */
+
+/* {{{ proto array getopt(string options)
+ Get options from the command line argument list */
+PHP_FUNCTION(getopt)
+{
+ char *options = NULL, **argv = NULL;
+ char opt[1] = { '\0' };
+ int argc = 0, options_len = 0;
+ zval *val, **args = NULL;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
+ &options, &options_len) ==
+FAILURE) {
+ return;
+ }
+
+ /*
+ * Get argv from the global symbol table. We calculate argc ourselves
+ * in order to be on the safe side, even though it is also available
+ * from the symbol table.
+ */
+ if (zend_hash_find(&EG(symbol_table), "argv", sizeof("argv"),
+ (void **) &args) != FAILURE) {
+ int pos = 0;
+ zval **arg;
+
+ argc = zend_hash_num_elements(Z_ARRVAL_PP(args));
+
+ /* Attempt to allocate enough memory to hold all of the arguments. */
+ if ((argv = (char **) emalloc(argc * sizeof(char *))) == NULL) {
+ RETURN_FALSE;
+ }
+
+ /* Reset the array indexes. */
+ zend_hash_internal_pointer_reset(Z_ARRVAL_PP(args));
+
+ /* Iterate over the hash to construct the argv array. */
+ while (zend_hash_get_current_data(Z_ARRVAL_PP(args),
+
+(void **)&arg) == SUCCESS) {
+ argv[pos++] = estrdup(Z_STRVAL_PP(arg));
+ zend_hash_move_forward(Z_ARRVAL_PP(args));
+ }
+ }
+
+ /* Initialize the return value as an array. */
+ if (array_init(return_value)) {
+ RETURN_FALSE;
+ }
+
+ /* Disable getopt()'s error messages. */
+ opterr = 0;
+
+ /* Invoke getopt(3) on the argument array. */
+ while (getopt(argc, argv, options) != -1) {
+
+ /* Skip unknown arguments. */
+ if (optopt == '?') {
+ continue;
+ }
+
+ /* Prepare the option character and the argument string. */
+ opt[0] = optopt;
+
+ MAKE_STD_ZVAL(val);
+ if (optarg != NULL) {
+ ZVAL_STRING(val, optarg, 1);
+ } else {
+ ZVAL_NULL(val);
+ }
+
+ /* Add this option / argument pair to the result hash. */
+ if (zend_hash_add(HASH_OF(return_value), opt, 1, (void *)&val,
+ sizeof(zval *), NULL) ==
+FAILURE) {
+ free_argv(argv, argc);
+ RETURN_FALSE;
+ }
+ }
+
+ free_argv(argv, argc);
}
/* }}} */
#endif
Index: php4/ext/standard/basic_functions.h
diff -u php4/ext/standard/basic_functions.h:1.107
php4/ext/standard/basic_functions.h:1.108
--- php4/ext/standard/basic_functions.h:1.107 Mon Sep 23 14:12:38 2002
+++ php4/ext/standard/basic_functions.h Sun Sep 29 23:02:52 2002
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: basic_functions.h,v 1.107 2002/09/23 18:12:38 wez Exp $ */
+/* $Id: basic_functions.h,v 1.108 2002/09/30 03:02:52 jon Exp $ */
#ifndef BASIC_FUNCTIONS_H
#define BASIC_FUNCTIONS_H
@@ -49,6 +49,8 @@
/* system functions */
PHP_FUNCTION(getenv);
PHP_FUNCTION(putenv);
+
+PHP_FUNCTION(getopt);
PHP_FUNCTION(get_current_user);
PHP_FUNCTION(set_time_limit);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php