]> granicus.if.org Git - php/commitdiff
initial version of ncurses extension,
authorHartmut Holzgraefe <hholzgra@php.net>
Tue, 12 Jun 2001 21:15:49 +0000 (21:15 +0000)
committerHartmut Holzgraefe <hholzgra@php.net>
Tue, 12 Jun 2001 21:15:49 +0000 (21:15 +0000)
see example1 for whats possible right now

13 files changed:
ext/ncurses/CREDITS [new file with mode: 0644]
ext/ncurses/EXPERIMENTAL [new file with mode: 0644]
ext/ncurses/Makefile.in [new file with mode: 0644]
ext/ncurses/c-prototypes [new file with mode: 0644]
ext/ncurses/config.m4 [new file with mode: 0644]
ext/ncurses/example1.php [new file with mode: 0644]
ext/ncurses/ncurses.c [new file with mode: 0644]
ext/ncurses/ncurses.php [new file with mode: 0644]
ext/ncurses/ncurses_fe.c [new file with mode: 0644]
ext/ncurses/ncurses_functions.c [new file with mode: 0644]
ext/ncurses/php_ncurses.h [new file with mode: 0644]
ext/ncurses/php_ncurses_fe.h [new file with mode: 0644]
ext/ncurses/tests/001.phpt [new file with mode: 0644]

diff --git a/ext/ncurses/CREDITS b/ext/ncurses/CREDITS
new file mode 100644 (file)
index 0000000..05679b8
--- /dev/null
@@ -0,0 +1,2 @@
+ncurses
+Hartmut Holzgraefe
diff --git a/ext/ncurses/EXPERIMENTAL b/ext/ncurses/EXPERIMENTAL
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ext/ncurses/Makefile.in b/ext/ncurses/Makefile.in
new file mode 100644 (file)
index 0000000..359ed0f
--- /dev/null
@@ -0,0 +1,8 @@
+# $Id$
+
+LTLIBRARY_NAME        = libncurses.la
+LTLIBRARY_SOURCES     = ncurses.c ncurses_fe.c ncurses_functions.c
+LTLIBRARY_SHARED_NAME = ncurses.la
+LTLIBRARY_SHARED_LIBADD  = $(NCURSES_SHARED_LIBADD)
+
+include $(top_srcdir)/build/dynlib.mk
diff --git a/ext/ncurses/c-prototypes b/ext/ncurses/c-prototypes
new file mode 100644 (file)
index 0000000..18b1c1b
--- /dev/null
@@ -0,0 +1,263 @@
+int addch(int);                                
+int addchnstr(int *, int);             
+int addchstr(int *);                   
+int addnstr(string, int);                      
+int addstr(string);                    
+int assume_default_colors (int, int);
+int attr_get(int *, int *, void *);            
+int attr_off(int, void *);                     
+int attr_on(int, void *);                      
+int attr_set(int, int, void *);                
+int attroff(int);                      
+int attron(int);                       
+int attrset(int);                      
+int baudrate(void);                            
+int beep(void);                                        
+int bkgd(int);                         
+void bkgdset(int);                             
+int border(int,int,int,int,int,int,int,int);   
+int box(resource, int, int);           
+bool can_change_color(void);                   
+int cbreak(void);                              
+int chgat(int, int, int, void *);      
+int clear(void);                                       
+int clearok(resource,bool);                    
+int clrtobot(void);                            
+int clrtoeol(void);                            
+int color_content(int,int*,int*,int*); 
+int color_set(int,void*);                      
+int copywin(resource,resource,int,int,int,int,int,int,int);    
+int curs_set(int);                             
+int def_prog_mode(void);                               
+int def_shell_mode(void);                      
+int define_key (string, int);
+int delay_output(int);                         
+int delch(void);                                       
+int deleteln(void);                            
+void delscreen(SCREEN *);                      
+int delwin(resource);                          
+int doupdate(void);                            
+int echo(void);                                                        
+int echochar(int);                     
+int endwin(void);                              
+int erase(void);                                       
+char erasechar(void);                          
+void filter(void);                             
+int flash(void);                                       
+int flushinp(void);                            
+int getbkgd(resource);                 
+int getch(void);                                       
+int getmouse(MEVENT *);
+int getnstr(string, int);                      
+int getstr(string);                            
+int halfdelay(int);                            
+bool has_colors(void);                         
+bool has_ic(void);                             
+bool has_il(void);                             
+int has_key(int);              /* do we have given key? */
+int hline(int, int);                           
+void idcok(resource, bool);                    
+int idlok(resource, bool);                     
+void immedok(resource, bool);                  
+int inch(void);                                
+int inchnstr(int *, int);                      
+int inchstr(int *);                            
+int init_color(int,int,int,int);               
+int init_pair(int,int,int);            
+int innstr(string, int);                               
+int insch(int);                                
+int insdelln(int);                             
+int insertln(void);                            
+int insnstr(string, int);                      
+int insstr(string);                    
+int instr(string);                             
+int intrflush(resource,bool);                  
+bool is_linetouched(resource,int);             
+bool is_wintouched(resource);                  
+bool isendwin(void);                           
+int keyok (int, bool);
+int keypad(resource,bool);                     
+char killchar(void);                           
+int leaveok(resource,bool);                    
+int mcprint(string, int);      /* direct data to printer */
+int meta(resource,bool);                               
+int mouseinterval(int);
+mmask_t mousemask(mmask_t, mmask_t *);
+int move(int, int);                            
+int mvaddch(int, int, int);            
+int mvaddchnstr(int, int, int *, int); 
+int mvaddchstr(int, int, int *);       
+int mvaddnstr(int, int, string, int);  
+int mvaddstr(int, int, string);                
+int mvchgat(int, int, int, int, int, void *);  
+int mvcur(int,int,int,int);                    
+int mvdelch(int, int);                         
+int mvderwin(resource, int, int);              
+int mvgetch(int, int);                         
+int mvgetnstr(int, int, string, int);          
+int mvgetstr(int, int, string);                        
+int mvhline(int, int, int, int);               
+int mvinch(int, int);                          
+int mvinchnstr(int, int, int *, int);          
+int mvinchstr(int, int, int *);                
+int mvinnstr(int, int, string, int);           
+int mvinsch(int, int, int);                    
+int mvinsnstr(int, int, string, int);  
+int mvinsstr(int, int, string);                
+int mvinstr(int, int, string);                 
+int mvprintw(int,int,  string,...);
+int mvscanw(int,int,  string,...);
+int mvwaddch(resource, int, int, int); 
+int mvwaddchnstr(resource, int, int, int *, int);
+int mvwaddchstr(resource, int, int, int *);    
+int mvwaddnstr(resource, int, int, string, int);       
+int mvwaddstr(resource, int, int, string);     
+int mvwchgat(resource, int, int, int, int, int, void *);
+int mvwdelch(resource, int, int);              
+int mvwgetch(resource, int, int);              
+int mvwgetnstr(resource, int, int, string, int);       
+int mvwgetstr(resource, int, int, string);     
+int mvwhline(resource, int, int, int, int);    
+int mvwin(resource,int,int);                   
+int mvwinch(resource, int, int);                       
+int mvwinchstr(resource, int, int, int *);             
+int mvwinnstr(resource, int, int, string, int);                
+int mvwinsch(resource, int, int, int);         
+int mvwinsnstr(resource, int, int, string, int);       
+int mvwinsstr(resource, int, int, string);             
+int mvwinstr(resource, int, int, string);              
+int mvwinchnstr(resource, int, int, int *, int);       
+int mvwprintw(resource,int,int,  string,...);  
+int mvwscanw(resource,int,int,  string,...);
+int mvwvline(resource,int, int, int, int);     
+int napms(int);                                        
+int nl(void);                                  
+int nocbreak(void);                            
+int nodelay(resource,bool);                    
+int noecho(void);                              
+int nonl(void);                                        
+void noqiflush(void);                          
+int noraw(void);                                       
+int notimeout(resource,bool);                  
+int overlay(resource,resource);                
+int overwrite(resource,resource);              
+int pair_content(int,int*,int*);               
+int pechochar(resource, int);          
+int pnoutrefresh(resource,int,int,int,int,int,int);
+int prefresh(resource,int,int,int,int,int,int);        
+int printw( string,...);               
+int putp(string);                              
+int putwin(resource, FILE *);                  
+void qiflush(void);                            
+int raw(void);                                 
+int redrawwin(resource);                               
+int refresh(void);                             
+int reset_prog_mode(void);                     
+int reset_shell_mode(void);                    
+int resetty(void);                             
+int resizeterm (int, int);
+int ripoffline(int, int (*init)(resource, int));       
+int savetty(void);                             
+int scanw( string,...);                
+int scr_dump(string);                  
+int scr_init(string);                  
+int scr_restore(string);                       
+int scr_set(string);                   
+int scrl(int);                                 
+int scroll(resource);                          
+int scrollok(resource,bool);                   
+int setscrreg(int,int);                                
+int slk_attroff(int);                  
+int slk_attr_off(int, void *);         /* generated:WIDEC */
+int slk_attron(int);                   
+int slk_attr_on(int,void*);                    /* generated:WIDEC */
+int slk_attrset(int);                  
+int slk_attr(void);                            
+int slk_attr_set(int,int,void*);       
+int slk_clear(void);                           
+int slk_color(int);                            
+int slk_init(int);                             
+int slk_noutrefresh(void);                     
+int slk_refresh(void);                         
+int slk_restore(void);                         
+int slk_set(int,string,int);           
+int slk_touch(void);                           
+int standend(void);                            
+int standout(void);                            
+int start_color(void);                         
+int syncok(resource, bool);                    
+int termattrs(void);                           
+int tigetflag( string);                
+int tigetnum( string);         
+void timeout(int);                             
+int typeahead(int);                            
+int ungetch(int);                              
+int ungetmouse(MEVENT *);
+int untouchwin(resource);                      
+int use_default_colors (void);
+void use_env(bool);                            
+int use_extended_names (bool);
+int vidattr(int);                              
+int vidputs(int, int (*)(int));                
+int vline(int, int);                           
+int vw_printw(resource,  string,va_list);      
+int vw_scanw(resource,  string,va_list);       
+int vwprintw(resource,  string,va_list);       
+int vwscanw(resource,  string,va_list);        
+int waddch(resource, int);             
+int waddchnstr(resource,int *const,int); 
+int waddchstr(resource,int *);         
+int waddnstr(resource,stringconst,int);        
+int waddstr(resource,string);          
+int wattr_get(resource, int *, int *, void *); 
+int wattr_off(resource,  int, void *); 
+int wattr_on(resource,  int, void *);  
+int wattr_set(resource, int, int, void *);             
+int wattroff(resource, int);                   
+int wattron(resource, int);                    
+int wattrset(resource, int);                   
+int wbkgd(resource,int);               
+void wbkgdset(resource,int);                   
+int wborder(resource,int,int,int,int,int,int,int,int); 
+int wchgat(resource, int, int, int, void *);
+int wclear(resource);                          
+int wclrtobot(resource);                               
+int wclrtoeol(resource);                               
+int wcolor_set(resource,int,void*);            
+void wcursyncup(resource);                     
+int wdelch(resource);                          
+int wdeleteln(resource);                               
+int wechochar(resource, int);          
+bool wenclose(resource, int, int);
+int werase(resource);                          
+int wgetch(resource);                          
+int wgetnstr(resource,string,int);             
+int wgetstr(resource, string);                 
+int whline(resource, int, int);                
+int winch(resource);                           
+int winchnstr(resource, int *, int);           
+int winchstr(resource, int *);         
+int winnstr(resource, string, int);            
+int winsch(resource, int);                     
+int winsdelln(resource,int);                   
+int winsertln(resource);                               
+int winsnstr(resource, string,int);    
+int winsstr(resource, string);         
+int winstr(resource, string);                  
+bool wmouse_trafo(resource win,int* y, int* x, bool to_screen);
+int wmove(resource,int,int);                   
+int wnoutrefresh(resource);                    
+int wprintw(resource,  string,...);    
+int wredrawln(resource,int,int);                       
+int wrefresh(resource);                                
+int wresize (resource, int, int);
+int wscanw(resource,  string,...);     
+int wscrl(resource,int);                               
+int wsetscrreg(resource,int,int);              
+int wstandend(resource);                               
+int wstandout(resource);                               
+void wsyncdown(resource);                      
+void wsyncup(resource);                                
+void wtimeout(resource,int);                   
+int wtouchln(resource,int,int,int);            
+int wvline(resource,int,int);                  
diff --git a/ext/ncurses/config.m4 b/ext/ncurses/config.m4
new file mode 100644 (file)
index 0000000..8111d02
--- /dev/null
@@ -0,0 +1,44 @@
+dnl $Id$
+dnl config.m4 for extension ncurses
+
+PHP_ARG_WITH(ncurses, for ncurses support,
+[  --with-ncurses             Include ncurses support])
+
+if test "$PHP_NCURSES" != "no"; then
+   # --with-ncurses -> check with-path
+        SEARCH_PATH="/usr/local /usr"     
+   SEARCH_FOR="/include/curses.h"
+   if test -r $PHP_NCURSES/; then # path given as parameter
+     NCURSES_DIR=$PHP_NCURSES
+   else # search default path list
+     AC_MSG_CHECKING(for ncurses files in default path)
+     for i in $SEARCH_PATH ; do
+       if test -r $i/$SEARCH_FOR; then
+         NCURSES_DIR=$i
+         AC_MSG_RESULT(found in $i)
+       fi
+     done
+   fi
+  
+   if test -z "$NCURSES_DIR"; then
+     AC_MSG_RESULT(not found)
+     AC_MSG_ERROR(Please reinstall the ncurses distribution)
+   fi
+
+   # --with-ncurses -> add include path
+   PHP_ADD_INCLUDE($NCURSES_DIR/include)
+
+   # --with-ncurses -> chech for lib and symbol presence
+   LIBNAME=ncurses 
+   LIBSYMBOL=initscr 
+   old_LIBS=$LIBS
+   LIBS="$LIBS -L$NCURSES_DIR/lib -lm -ldl"
+   AC_CHECK_LIB($LIBNAME, $LIBSYMBOL, [AC_DEFINE(HAVE_NCURSESLIB,1,[ ])],
+                               [AC_MSG_ERROR(wrong ncurses lib version or lib not found)])
+   LIBS=$old_LIBS
+  
+   PHP_SUBST(NCURSES_SHARED_LIBADD)
+   PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $NCURSES_DIR/lib, SAPRFC_SHARED_LIBADD)
+
+  PHP_EXTENSION(ncurses, $ext_shared)
+fi
diff --git a/ext/ncurses/example1.php b/ext/ncurses/example1.php
new file mode 100644 (file)
index 0000000..0dc689b
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+$n=0;
+ncurses_init();
+if(ncurses_has_colors()){
+ncurses_start_color();
+        ncurses_init_pair(1,NCURSES_COLOR_RED,NCURSES_COLOR_BLACK);
+        ncurses_init_pair(2,NCURSES_COLOR_GREEN,NCURSES_COLOR_BLACK);
+        ncurses_init_pair(3,NCURSES_COLOR_YELLOW,NCURSES_COLOR_BLACK);
+        ncurses_init_pair(4,NCURSES_COLOR_BLUE,NCURSES_COLOR_BLACK);
+        ncurses_init_pair(5,NCURSES_COLOR_MAGENTA,NCURSES_COLOR_BLACK);
+        ncurses_init_pair(6,NCURSES_COLOR_CYAN,NCURSES_COLOR_BLACK);
+        ncurses_init_pair(7,NCURSES_COLOR_WHITE,NCURSES_COLOR_BLACK);
+}
+while(1){
+for ($x=0; $x<80; $x++) {
+for ($y=0; $y<24; $y++) {
+  $n++;
+  ncurses_move($y,$x);
+  ncurses_addch($n+64);
+  ncurses_color_set($n%8);
+  ncurses_refresh();
+  if($n>26)$n=0;
+}
+}
+}
+ncurses_getch();
+?>
+
diff --git a/ext/ncurses/ncurses.c b/ext/ncurses/ncurses.c
new file mode 100644 (file)
index 0000000..6126002
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP version 4.0                                                      |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.02 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available at through the world-wide-web at                           |
+   | http://www.php.net/license/2_02.txt.                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Hartmut Holzgraefe <hartmut@six.de>                         |
+   |                                                                      |
+   +----------------------------------------------------------------------+
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#include "php_ini.h"
+#include "php_ncurses.h"
+
+/* If you declare any globals in php_ncurses.h uncomment this:
+ZEND_DECLARE_MODULE_GLOBALS(ncurses)
+*/
+
+/* True global resources - no need for thread safety here */
+int le_ncurses;
+
+
+static void ncurses_destruct(zend_rsrc_list_entry *rsrc) {
+       WINDOW **pwin = (WINDOW **)rsrc->ptr;
+
+       delwin(*pwin);
+       efree(pwin);
+}
+
+
+/* {{{ ncurses_module_entry
+ */
+zend_module_entry ncurses_module_entry = {
+       "ncurses",
+       ncurses_functions,
+       PHP_MINIT(ncurses),
+       PHP_MSHUTDOWN(ncurses),
+       PHP_RINIT(ncurses),             /* Replace with NULL if there's nothing to do at request start */
+       PHP_RSHUTDOWN(ncurses), /* Replace with NULL if there's nothing to do at request end */
+       PHP_MINFO(ncurses),
+       STANDARD_MODULE_PROPERTIES
+};
+/* }}} */
+
+#ifdef COMPILE_DL_NCURSES
+ZEND_GET_MODULE(ncurses)
+#endif
+
+/* {{{ PHP_INI
+ */
+/* Remove comments and fill if you need to have entries in php.ini
+PHP_INI_BEGIN()
+    STD_PHP_INI_ENTRY("ncurses.value",      "42", PHP_INI_ALL, OnUpdateInt, global_value, zend_ncurses_globals, ncurses_globals)
+    STD_PHP_INI_ENTRY("ncurses.string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_ncurses_globals, ncurses_globals)
+PHP_INI_END()
+*/
+/* }}} */
+
+#define PHP_NCURSES_CONST(x)  REGISTER_LONG_CONSTANT("NCURSES_"#x, x, CONST_CS | CONST_PERSISTENT)
+
+/* {{{ PHP_MINIT_FUNCTION
+ */
+PHP_MINIT_FUNCTION(ncurses)
+{
+/* Remove comments if you have entries in php.ini
+       REGISTER_INI_ENTRIES();
+*/
+
+       PHP_NCURSES_CONST(COLOR_BLACK);
+       PHP_NCURSES_CONST(COLOR_RED);
+       PHP_NCURSES_CONST(COLOR_GREEN);
+       PHP_NCURSES_CONST(COLOR_YELLOW);
+       PHP_NCURSES_CONST(COLOR_BLUE);
+       PHP_NCURSES_CONST(COLOR_MAGENTA);
+       PHP_NCURSES_CONST(COLOR_CYAN);
+       PHP_NCURSES_CONST(COLOR_WHITE);
+       
+       le_ncurses = zend_register_list_destructors_ex(ncurses_destruct, NULL, "ncurses_hanlde", module_number);        
+
+       return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MSHUTDOWN_FUNCTION
+ */
+PHP_MSHUTDOWN_FUNCTION(ncurses)
+{
+/* Remove comments if you have entries in php.ini
+       UNREGISTER_INI_ENTRIES();
+       endwin();
+*/
+
+       return SUCCESS;
+}
+/* }}} */
+
+/* Remove if there's nothing to do at request start */
+/* {{{ PHP_RINIT_FUNCTION
+ */
+PHP_RINIT_FUNCTION(ncurses)
+{
+       return SUCCESS;
+}
+/* }}} */
+
+/* Remove if there's nothing to do at request end */
+/* {{{ PHP_RSHUTDOWN_FUNCTION
+ */
+PHP_RSHUTDOWN_FUNCTION(ncurses)
+{
+       return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MINFO_FUNCTION
+ */
+PHP_MINFO_FUNCTION(ncurses)
+{
+       php_info_print_table_start();
+       php_info_print_table_header(2, "ncurses support", "enabled");
+       php_info_print_table_end();
+
+       /* Remove comments if you have entries in php.ini
+       DISPLAY_INI_ENTRIES();
+       */
+}
+/* }}} */
+
+/* Remove the following function when you have succesfully modified config.m4
+   so that your module can be compiled into PHP, it exists only for testing
+   purposes. */
+
+/* Every user-visible function in PHP should document itself in the source */
+/* {{{ proto string confirm_ncurses_compiled(string arg)
+   Return a string to confirm that the module is compiled in */
+PHP_FUNCTION(confirm_ncurses_compiled)
+{
+       zval **arg;
+       int len;
+       char string[256];
+
+       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+
+       convert_to_string_ex(arg);
+
+       len = sprintf(string, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "ncurses", Z_STRVAL_PP(arg));
+       RETURN_STRINGL(string, len, 1);
+}
+/* }}} */
+/* The previous line is meant for vim and emacs, so it can correctly fold and 
+   unfold functions in source code. See the corresponding marks just before 
+   function definition, where the functions purpose is also documented. Please 
+   follow this convention for the convenience of others editing your code.
+*/
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 tw=78 fdm=marker
+ * vim<600: sw=4 ts=4 tw=78
+ */
diff --git a/ext/ncurses/ncurses.php b/ext/ncurses/ncurses.php
new file mode 100644 (file)
index 0000000..416b108
--- /dev/null
@@ -0,0 +1,10 @@
+<?
+$module = 'ncurses';
+$function = 'confirm_' . $module . '_compiled';
+if (extension_loaded($module)) {
+       $str = $function($module);
+} else {
+       $str = "Module $module is not compiled into PHP";
+}
+echo "$str\n";
+?>
diff --git a/ext/ncurses/ncurses_fe.c b/ext/ncurses/ncurses_fe.c
new file mode 100644 (file)
index 0000000..fdd4af5
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP version 4.0                                                      |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.02 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available at through the world-wide-web at                           |
+   | http://www.php.net/license/2_02.txt.                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Hartmut Holzgraefe <hartmut@six.de>                         |
+   |                                                                      |
+   +----------------------------------------------------------------------+
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#include "php_ini.h"
+#include "php_ncurses.h"
+
+/* ncurses_functions[]
+ *
+ * Every user visible function must have an entry in ncurses_functions[].
+ */
+function_entry ncurses_functions[] = {
+       PHP_FE(confirm_ncurses_compiled,        NULL)           /* For testing, remove later. */
+       PHP_FE(ncurses_init,    NULL)
+       PHP_FE(ncurses_end,    NULL)
+       PHP_FE(ncurses_getch,    NULL)
+       PHP_FE(ncurses_move,    NULL)
+       PHP_FE(ncurses_addch,    NULL)
+       PHP_FE(ncurses_refresh,    NULL)
+       PHP_FE(ncurses_has_colors,    NULL)
+       PHP_FE(ncurses_start_color,    NULL)
+       PHP_FE(ncurses_color_set,    NULL)
+       PHP_FE(ncurses_init_pair,    NULL)
+       PHP_FE(ncurses_newwin,    NULL)
+       PHP_FE(ncurses_delwin,    NULL)
+       {NULL, NULL, NULL}      /* Must be the last line in ncurses_functions[] */
+};
diff --git a/ext/ncurses/ncurses_functions.c b/ext/ncurses/ncurses_functions.c
new file mode 100644 (file)
index 0000000..ea73ba1
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP version 4.0                                                      |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.02 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available at through the world-wide-web at                           |
+   | http://www.php.net/license/2_02.txt.                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Hartmut Holzgraefe <hartmut@six.de>                         |
+   |                                                                      |
+   +----------------------------------------------------------------------+
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#include "php_ini.h"
+#include "php_ncurses.h"
+
+/* {{{ proto int ncurses_addch(int ch)
+    */
+PHP_FUNCTION(ncurses_addch)
+{
+       zval **ch;
+       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &ch) == FAILURE){
+               WRONG_PARAM_COUNT;
+       }
+       
+       convert_to_long_ex(ch);
+
+       RETURN_LONG(addch(_INT(ch)));
+}
+/* }}} */
+
+/* {{{ proto int ncurses_color_set(int pair)
+    */
+PHP_FUNCTION(ncurses_color_set)
+{
+       zval **pair;
+       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &pair) == FAILURE){
+               WRONG_PARAM_COUNT;
+       }
+       
+       convert_to_long_ex(pair);
+
+       RETURN_LONG(color_set(_INT(pair),NULL));
+}
+/* }}} */
+
+/* {{{ proto int ncurses_newwin(int ch)
+    */
+PHP_FUNCTION(ncurses_delwin)
+{
+       zval **handle;
+       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &handle) == FAILURE){
+               WRONG_PARAM_COUNT;
+       }
+
+       convert_to_long_ex(handle);
+
+       /* TODO resource type check */
+
+       zend_list_delete((*handle)->value.lval);
+}
+/* }}} */
+
+/* {{{ proto int ncurses_end()
+    */
+PHP_FUNCTION(ncurses_end)
+{
+       RETURN_LONG(endwin());             /* endialize the curses library */
+}
+/* }}} */
+
+/* {{{ proto int ncurses_getch()
+    */
+PHP_FUNCTION(ncurses_getch)
+{
+       RETURN_LONG(getch());
+}
+/* }}} */
+
+/* {{{ proto int ncurses_has_colors()
+    */
+PHP_FUNCTION(ncurses_has_colors)
+{
+       RETURN_LONG(has_colors());
+}
+/* }}} */
+
+/* {{{ proto int ncurses_init()
+    */
+PHP_FUNCTION(ncurses_init)
+{
+       initscr();             /* initialize the curses library */
+       keypad(stdscr, TRUE);  /* enable keyboard mapping */
+       (void) nonl();         /* tell curses not to do NL->CR/NL on output */
+       (void) cbreak();       /* take input chars one at a time, no wait for \n */}
+/* }}} */
+
+/* {{{ proto int ncurses_init_pair(int pair, int fg, int bg)
+    */
+PHP_FUNCTION(ncurses_init_pair)
+{
+       zval **pair, **fg, **bg;
+       if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &pair, &fg, &bg) == FAILURE){
+               WRONG_PARAM_COUNT;
+       }
+       
+       convert_to_long_ex(pair);
+       convert_to_long_ex(fg);
+       convert_to_long_ex(bg);
+
+       RETURN_LONG(init_pair(_INT(pair),_INT(fg),_INT(bg)));
+}
+/* }}} */
+
+/* {{{ proto int ncurses_move(int x, int y)
+    */
+PHP_FUNCTION(ncurses_move)
+{
+       zval **x, **y;
+       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &x, &y) == FAILURE){
+               WRONG_PARAM_COUNT;
+       }
+       
+       convert_to_long_ex(x);
+       convert_to_long_ex(y);
+
+       RETURN_LONG(move(_INT(x),_INT(y)));
+}
+/* }}} */
+
+/* {{{ proto int ncurses_newwin(int ch)
+    */
+PHP_FUNCTION(ncurses_newwin)
+{
+       zval **rows,**cols,**y,**x;
+       WINDOW **pwin = (WINDOW **)emalloc(sizeof(WINDOW *));
+
+       if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &rows,&cols,&y,&x) == FAILURE){
+               WRONG_PARAM_COUNT;
+       }
+       
+       convert_to_long_ex(rows);
+       convert_to_long_ex(cols);
+       convert_to_long_ex(y);
+       convert_to_long_ex(x);
+
+       *pwin=newwin(_INT(rows),_INT(cols),_INT(y),_INT(x));
+       
+       if(!*pwin) {
+               efree(pwin);
+               RETURN_FALSE;
+       }
+
+       ZEND_REGISTER_RESOURCE(return_value, pwin, le_ncurses);
+}
+/* }}} */
+
+/* {{{ proto int ncurses_refresh(int ch)
+    */
+PHP_FUNCTION(ncurses_refresh)
+{
+       RETURN_LONG(refresh());
+}
+/* }}} */
+
+/* {{{ proto int ncurses_start_color()
+    */
+PHP_FUNCTION(ncurses_start_color)
+{
+       RETURN_LONG(start_color());
+}
+/* }}} */
diff --git a/ext/ncurses/php_ncurses.h b/ext/ncurses/php_ncurses.h
new file mode 100644 (file)
index 0000000..84cac5a
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP version 4.0                                                      |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.02 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available at through the world-wide-web at                           |
+   | http://www.php.net/license/2_02.txt.                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Hartmut Holzgraefe <hartmut@six.de>                         |
+   |                                                                      |
+   +----------------------------------------------------------------------+
+ */
+
+#ifndef PHP_NCURSES_H
+#define PHP_NCURSES_H
+
+#include <curses.h>
+
+#define _STRING(x) ((*x)->value.str.val)
+#define _INT(x)    ((*x)->value.lval)
+#define _HASH(x)   ((*x)->value.ht)
+
+extern int le_ncurses;
+
+extern zend_module_entry ncurses_module_entry;
+#define phpext_ncurses_ptr &ncurses_module_entry
+
+extern function_entry ncurses_functions[];
+#include "php_ncurses_fe.h"
+
+#ifdef PHP_WIN32
+#define PHP_NCURSES_API __declspec(dllexport)
+#else
+#define PHP_NCURSES_API
+#endif
+
+PHP_MINIT_FUNCTION(ncurses);
+PHP_MSHUTDOWN_FUNCTION(ncurses);
+PHP_RINIT_FUNCTION(ncurses);
+PHP_RSHUTDOWN_FUNCTION(ncurses);
+PHP_MINFO_FUNCTION(ncurses);
+
+/* 
+       Declare any global variables you may need between the BEGIN
+       and END macros here:     
+
+ZEND_BEGIN_MODULE_GLOBALS(ncurses)
+       int   global_value;
+       char *global_string;
+ZEND_END_MODULE_GLOBALS(ncurses)
+*/
+
+/* In every function that needs to use variables in php_ncurses_globals,
+   do call NCURSES_LS_FETCH(); after declaring other variables used by
+   that function, and always refer to them as NCURSES_G(variable).
+   You are encouraged to rename these macros something shorter, see
+   examples in any other php module directory.
+*/
+
+#ifdef ZTS
+#define NCURSES_G(v) (ncurses_globals->v)
+#define NCURSES_LS_FETCH() zend_ncurses_globals *ncurses_globals = ts_resource(ncurses_globals_id)
+#else
+#define NCURSES_G(v) (ncurses_globals.v)
+#define NCURSES_LS_FETCH()
+#endif
+
+#endif /* PHP_NCURSES_H */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ */
diff --git a/ext/ncurses/php_ncurses_fe.h b/ext/ncurses/php_ncurses_fe.h
new file mode 100644 (file)
index 0000000..ae652c0
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP version 4.0                                                      |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.02 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available at through the world-wide-web at                           |
+   | http://www.php.net/license/2_02.txt.                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Hartmut Holzgraefe <hartmut@six.de>                         |
+   |                                                                      |
+   +----------------------------------------------------------------------+
+ */
+
+#ifndef PHP_NCURSES_FE_H
+#define PHP_NCURSES_FE_H
+
+PHP_FUNCTION(confirm_ncurses_compiled);        /* For testing, remove later. */
+PHP_FUNCTION(ncurses_init);
+PHP_FUNCTION(ncurses_end);
+PHP_FUNCTION(ncurses_getch);
+PHP_FUNCTION(ncurses_move);
+PHP_FUNCTION(ncurses_addch);
+PHP_FUNCTION(ncurses_refresh);
+PHP_FUNCTION(ncurses_has_colors);
+PHP_FUNCTION(ncurses_start_color);
+PHP_FUNCTION(ncurses_color_set);
+PHP_FUNCTION(ncurses_init_pair);
+PHP_FUNCTION(ncurses_newwin);
+PHP_FUNCTION(ncurses_delwin);
+
+#endif
diff --git a/ext/ncurses/tests/001.phpt b/ext/ncurses/tests/001.phpt
new file mode 100644 (file)
index 0000000..90d9c14
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+Check for ncurses presence
+--SKIPIF--
+<?php if (!extension_loaded("ncurses")) print "skip"; ?>
+--POST--
+--GET--
+--FILE--
+<?php 
+echo "ncurses extension is available";
+/*
+       you can add regression tests for your extension here
+
+  the output of your test code has to be equal to the
+  text in the --EXPECT-- section below for the tests
+  to pass, differences between the output and the
+  expected text are interpreted as failure
+
+       see php4/tests/README for further information on
+  writing regression tests
+*/
+?>
+--EXPECT--
+ncurses extension is available
\ No newline at end of file