Taking a few comments into consideration, here's a new patch for adding C++ 
code-generating abilities to ext_skel. The new patch doesn't use a separate 
skeleton.cpp file. Instead, it adds some lines like 

/* __begin_extern_c__ */
/* __end_extern_c__ */

to skeleton.c and lets ext_skel either replace them with the proper C++ 
stuff or get rid of it altogether. I didn't want to make the extname.c 
output any more complicated with #ifdef __cplusplus preprocessor nonsense, 
'cause having extension first-timers asking why there's C++ stuff in their 
C file would suck.

Another slight change to skeleton.c just gets rid of the string named 
"string" and replaces it with "str". This is just to get rid of any 
conflict that might come up if someone #includes the C++ string library in 
their extension, so they don't need to worry about C-string named "string" 
being confused with the C++ data type "string".

Comments?

J

Index: ext_skel
===================================================================
RCS file: /repository/php4/ext/ext_skel,v
retrieving revision 1.44
diff -u -3 -p -r1.44 ext_skel
--- ext_skel	18 Nov 2002 15:55:07 -0000	1.44
+++ ext_skel	2 Dec 2002 15:08:10 -0000
@@ -7,7 +7,7 @@ givup() {
 
 usage() {
 echo "$0 --extname=module [--proto=file] [--stubs=file] [--xml[=file]]"
-echo "           [--skel=dir] [--full-xml] [--no-help]"
+echo "           [--skel=dir] [--full-xml] [--no-help] [--cpp]"
 echo ""
 echo "  --extname=module   module is the name of your extension"
 echo "  --proto=file       file contains prototypes of functions to create"
@@ -18,6 +18,7 @@ echo "  --full-xml         generate xml 
 echo "                     (not yet implemented)"
 echo "  --no-help          don't try to be nice and create comments in the code"
 echo "                     and helper functions to test if the module compiled"
+echo "  --cpp              create a C++ extension"
 exit 1
 }
 
@@ -58,6 +59,9 @@ while test $# -gt 0; do
     --skel=?*)
 	skel_dir=$optarg
 	;;
+    --cpp)
+    cpp="yes"
+    ;;
     *)
 	usage
 	;;
@@ -94,7 +98,7 @@ if test -z "$stubs"; then
 fi
 
 if test -n "$proto"; then
-  cat $proto | awk -v extname=$extname -v stubs=$stubs -v stubfile=$stubfile -v xml=$xml -v full_xml=$full_xml -v i_know_what_to_do_shut_up_i_dont_need_your_help_mode=$no_help -f $skel_dir/create_stubs
+  cat $proto | awk -v extname=$extname -v stubs=$stubs -v stubfile=$stubfile -v xml=$xml -v full_xml=$full_xml -v i_know_what_to_do_shut_up_i_dont_need_your_help_mode=$no_help -v cpp=$cpp -f $skel_dir/create_stubs
 fi
 
 if test -z "$stubs"; then
@@ -165,11 +169,16 @@ if test "\$PHP_$EXTNAME" != "no"; then
   dnl ])
   dnl
   dnl PHP_SUBST(${EXTNAME}_SHARED_LIBADD)
+eof
 
-  PHP_NEW_EXTENSION($extname, $extname.c, \$ext_shared)
+if test "$cpp" = "yes"; then
+  echo "  PHP_REQUIRE_CXX()" >>config.m4
+  echo "  PHP_NEW_EXTENSION($extname, $extname.cpp, \$ext_shared)" >>config.m4
+else
+  echo "  PHP_NEW_EXTENSION($extname, $extname.c, \$ext_shared)" >>config.m4
 fi
-eof
 
+echo "fi" >>config.m4
 
 $ECHO_N " .cvsignore$ECHO_C"
 cat >.cvsignore <<eof
@@ -178,9 +187,22 @@ cat >.cvsignore <<eof
 *.la
 eof
 
-$ECHO_N " $extname.c$ECHO_C"
+if test "$cpp" = "yes"; then
+    $ECHO_N " $extname.cpp$ECHO_C"
+else
+    $ECHO_N " $extname.c$ECHO_C"
+fi
 echo "s/extname/$extname/g" > sedscript
 echo "s/EXTNAME/$EXTNAME/g"  >> sedscript
+
+if test "$cpp" = "yes"; then
+    echo "s/\/\* __begin_extern_c__ \*\//extern \"C\" {/" >> sedscript
+    echo "s/\/\* __end_extern_c__ \*\//}/" >> sedscript 
+else
+    echo "s/\/\* __begin_extern_c__ \*\///" >> sedscript
+    echo "s/\/\* __end_extern_c__ \*\///" >> sedscript
+fi
+
 echo '/__function_entries_here__/r function_entries'  >> sedscript
 echo '/__function_stubs_here__/r function_stubs'  >> sedscript
 echo '/__header_here__/r ../../header'  >> sedscript
@@ -189,6 +211,7 @@ echo '/__function_entries_here__/D'  >> 
 echo '/__function_stubs_here__/D'  >> sedscript
 echo '/__header_here__/D'  >> sedscript
 echo '/__footer_here__/D'  >> sedscript
+
 if [ ! -z "$no_help" ]; then
     echo "/confirm_$extname_compiled/D" >> sedscript
     echo '/Remove the following/,/^\*\//D' >> sedscript
@@ -197,7 +220,11 @@ if [ ! -z "$no_help" ]; then
     echo '/^[[:space:]]*\/\*/,/^[[:space:]]*\*\//D' >> sedscript
 fi
 
-sed -f sedscript < $skel_dir/skeleton.c > $extname.c
+if test "$cpp" = "yes"; then
+    sed -f sedscript < $skel_dir/skeleton.c > $extname.cpp
+else
+    sed -f sedscript < $skel_dir/skeleton.c > $extname.c
+fi
 
 
 $ECHO_N " php_$extname.h$ECHO_C"
@@ -273,7 +300,15 @@ To use your new extension, you will have
 4.  $ ./configure --[with|enable]-$extname
 5.  $ make
 6.  $ ./php -f ext/$extname/$extname.php
-7.  $ vi ext/$extname/$extname.c
+eof
+
+  if test "$cpp" = "yes"; then
+      echo "7.  $ vi ext/$extname/$extname.cpp"
+  else
+      echo "7.  $ vi ext/$extname/$extname.c"
+  fi
+
+  cat <<eof
 8.  $ make
 
 Repeat steps 3-6 until you are satisfied with ext/$extname/config.m4 and
Index: skeleton/skeleton.c
===================================================================
RCS file: /repository/php4/ext/skeleton/skeleton.c,v
retrieving revision 1.32
diff -u -3 -p -r1.32 skeleton.c
--- skeleton/skeleton.c	2 Dec 2001 00:59:44 -0000	1.32
+++ skeleton/skeleton.c	2 Dec 2002 15:08:10 -0000
@@ -4,9 +4,12 @@
 #include "config.h"
 #endif
 
+/* __begin_extern_c__ */
 #include "php.h"
 #include "php_ini.h"
 #include "ext/standard/info.h"
+/* __end_extern_c__ */
+
 #include "php_extname.h"
 
 /* If you declare any globals in php_extname.h uncomment this:
@@ -48,7 +51,9 @@ zend_module_entry extname_module_entry =
 /* }}} */
 
 #ifdef COMPILE_DL_EXTNAME
+/* __begin_extern_c__ */
 ZEND_GET_MODULE(extname)
+/* __end_extern_c__ */
 #endif
 
 /* {{{ PHP_INI
@@ -139,14 +144,14 @@ PHP_FUNCTION(confirm_extname_compiled)
 {
 	char *arg = NULL;
 	int arg_len, len;
-	char string[256];
+	char str[256];
 
 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
 		return;
 	}
 
-	len = sprintf(string, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "extname", arg);
-	RETURN_STRINGL(string, len, 1);
+	len = sprintf(str, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "extname", arg);
+	RETURN_STRINGL(str, len, 1);
 }
 /* }}} */
 /* The previous line is meant for vim and emacs, so it can correctly fold and 

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to