cvs: /php4 NEWS mergesort.c php_ini.h /php4/ext/com COM.c /php4/ext/session session.c /php4/ext/standard basic_functions.c
| From: | Zeev Suraski | Date: | Sat, 06 Nov 1999 10:02:26 +0000 |
| Subject: | cvs: /php4 NEWS mergesort.c php_ini.h /php4/ext/com COM.c /php4/ext/session session.c /php4/ext/standard basic_functions.c | ||
| Groups: | php.version4 | ||
| Request: | Send a blank email to php-version4+get-5912@lists.php.net to get a copy of this message | ||
zeev Sat Nov 6 05:02:26 1999 EDT
Modified files:
/php4 NEWS mergesort.c php_ini.h
/php4/ext/com COM.c
/php4/ext/session session.c
/php4/ext/standard basic_functions.c
Log:
- Win32 fixes
- COM module improvements from Boris Wedl
Index: php4/NEWS
diff -u php4/NEWS:1.23 php4/NEWS:1.24
--- php4/NEWS:1.23 Fri Nov 5 21:09:06 1999
+++ php4/NEWS Sat Nov 6 05:01:52 1999
@@ -2,7 +2,7 @@
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ?? 1999, Version 4.0 Beta 3
-
+- Improved the Win32 COM module to support [out] parameters (Boris Wedl)
- Fixed garbage returned at the end of certain Sybase-Columns (Thies)
Patch submitted by: neal@wanlink.com
- Added Microsoft SQL Server module for Win32 (Frank)
Index: php4/mergesort.c
diff -u php4/mergesort.c:1.2 php4/mergesort.c:1.3
--- php4/mergesort.c:1.2 Sat Oct 16 06:14:45 1999
+++ php4/mergesort.c Sat Nov 6 05:01:52 1999
@@ -62,8 +62,8 @@
#include <winsock.h> /* Includes definition for u_char */
#endif
-static void setup (u_char *, u_char *, size_t, size_t, int (*)());
-static void insertionsort (u_char *, size_t, size_t, int (*)());
+static void setup(u_char *list1, u_char *list2, size_t n, size_t size, int (*cmp)(const void *,
const void *));
+static void insertionsort(u_char *a, size_t n, size_t size, int (*cmp)(const void *, const void
*));
#define ISIZE sizeof(int)
#define PSIZE sizeof(u_char *)
@@ -98,14 +98,10 @@
/*
* Arguments are as for qsort.
*/
-int
-mergesort(base, nmemb, size, cmp)
- void *base;
- size_t nmemb;
- register size_t size;
- int (*cmp) (const void *, const void *);
+int mergesort(void *base, size_t nmemb, size_t size, int (*cmp)(const void *, const void *))
{
- register int i, sense;
+ register unsigned int i;
+ register int sense;
int big, iflag;
register u_char *f1, *f2, *t, *b, *tp2, *q, *l1, *l2;
u_char *list2, *list1, *p2, *p, *last, **p1;
@@ -261,11 +257,7 @@
* when THRESHOLD/2 pairs compare with same sense. (Only used when NATURAL
* is defined. Otherwise simple pairwise merging is used.)
*/
-void
-setup(list1, list2, n, size, cmp)
- size_t n, size;
- int (*cmp) (const void *, const void *);
- u_char *list1, *list2;
+static void setup(u_char *list1, u_char *list2, size_t n, size_t size, int (*cmp)(const void *,
const void *))
{
int i, length, size2, tmp, sense;
u_char *f1, *f2, *s, *l2, *last, *p2;
@@ -335,11 +327,7 @@
* This is to avoid out-of-bounds addresses in sorting the
* last 4 elements.
*/
-static void
-insertionsort(a, n, size, cmp)
- u_char *a;
- size_t n, size;
- int (*cmp) (const void *, const void *);
+static void insertionsort(u_char *a, size_t n, size_t size, int (*cmp)(const void *, const void *))
{
u_char *ai, *s, *t, *u, tmp;
int i;
Index: php4/php_ini.h
diff -u php4/php_ini.h:1.15 php4/php_ini.h:1.16
--- php4/php_ini.h:1.15 Sun Sep 5 15:49:54 1999
+++ php4/php_ini.h Sat Nov 6 05:01:52 1999
@@ -117,11 +117,12 @@
#define INI_INT(name) php_ini_long((name), sizeof(name), 0)
#define INI_FLT(name) php_ini_double((name), sizeof(name), 0)
#define INI_STR(name) php_ini_string((name), sizeof(name), 0)
+#define INI_BOOL(name) ((zend_bool) INI_INT(name))
-
#define INI_ORIG_INT(name) php_ini_long((name), sizeof(name), 1)
#define INI_ORIG_FLT(name) php_ini_double((name), sizeof(name), 1)
#define INI_ORIG_STR(name) php_ini_string((name), sizeof(name), 1)
+#define INI_ORIG_BOOL(name) ((zend_bool) INI_ORIG_INT(name))
#define REGISTER_INI_ENTRIES() php_register_ini_entries(ini_entries, module_number)
Index: php4/ext/com/COM.c
diff -u php4/ext/com/COM.c:1.13 php4/ext/com/COM.c:1.14
--- php4/ext/com/COM.c:1.13 Wed Oct 20 15:16:17 1999
+++ php4/ext/com/COM.c Sat Nov 6 05:01:53 1999
@@ -70,7 +70,7 @@
}
-php3_module_entry COM_module_entry = {
+zend_module_entry COM_module_entry = {
"Win32 COM", COM_functions, PHP_MINIT(COM), PHP_MSHUTDOWN(COM), NULL, NULL,
PHP_MINFO(COM), STANDARD_MODULE_PROPERTIES
};
@@ -78,7 +78,7 @@
static int php_COM_load_typelib(char *typelib_name, int mode);
-static char *_php3_COM_error_message(HRESULT hr)
+static char *php_COM_error_message(HRESULT hr)
{
void *pMsgBuf;
@@ -126,7 +126,7 @@
}
-static char *_php3_string_from_clsid(CLSID *clsid)
+static char *php_string_from_clsid(CLSID *clsid)
{
LPOLESTR ole_clsid;
char *clsid_str;
@@ -140,7 +140,7 @@
}
-static void _php3_idispatch_destructor(IDispatch *i_dispatch)
+static void php_idispatch_destructor(IDispatch *i_dispatch)
{
i_dispatch->lpVtbl->Release(i_dispatch);
}
@@ -217,7 +217,7 @@
PHP_MINIT_FUNCTION(COM)
{
CoInitialize(NULL);
- le_idispatch = register_list_destructors(_php3_idispatch_destructor,NULL);
+ le_idispatch = register_list_destructors(php_idispatch_destructor,NULL);
php_register_COM_class();
REGISTER_INI_ENTRIES();
return SUCCESS;
@@ -266,7 +266,7 @@
// obtain CLSID
if (FAILED(hr)) {
- error_message = _php3_COM_error_message(hr);
+ error_message = php_COM_error_message(hr);
php_error(E_WARNING,"Invalid ProgID: %s\n", error_message);
LocalFree(error_message);
RETURN_FALSE;
@@ -295,8 +295,8 @@
efree(server_info.pwszName);
}
if (FAILED(hr)) {
- error_message = _php3_COM_error_message(hr);
- clsid_str = _php3_string_from_clsid(&clsid);
+ error_message = php_COM_error_message(hr);
+ clsid_str = php_string_from_clsid(&clsid);
php_error(E_WARNING,"Unable to obtain IDispatch interface for CLSID %s:
%s",clsid_str,error_message);
LocalFree(error_message);
efree(clsid_str);
@@ -309,43 +309,78 @@
static void php_variant_to_pval(VARIANTARG *var_arg, pval *pval_arg, int persistent)
{
- switch (var_arg->vt) {
+
+ switch (var_arg->vt & ~VT_BYREF) {
case VT_EMPTY:
var_uninit(pval_arg);
break;
case VT_UI1:
- pval_arg->value.lval = (long) var_arg->bVal;
+ if (pval_arg->is_ref == 0 || (var_arg->vt & VT_BYREF) != VT_BYREF)
+ pval_arg->value.lval = (long) var_arg->bVal;
+ else
+ pval_arg->value.lval = (long)*(var_arg->pbVal);
pval_arg->type = IS_LONG;
break;
case VT_I2:
- pval_arg->value.lval = (long) var_arg->iVal;
+ if (pval_arg->is_ref == 0 || (var_arg->vt & VT_BYREF) != VT_BYREF)
+ pval_arg->value.lval = (long) var_arg->iVal;
+ else
+ pval_arg->value.lval = (long )*(var_arg->piVal);
pval_arg->type = IS_LONG;
break;
case VT_I4:
- pval_arg->value.lval = var_arg->lVal;
+ if (pval_arg->is_ref == 0 || (var_arg->vt & VT_BYREF) != VT_BYREF)
+ pval_arg->value.lval = var_arg->lVal;
+ else
+ pval_arg->value.lval = *(var_arg->plVal);
pval_arg->type = IS_LONG;
break;
case VT_R4:
- pval_arg->value.dval = (double) var_arg->fltVal;
+ if (pval_arg->is_ref == 0 || (var_arg->vt & VT_BYREF) != VT_BYREF)
+ pval_arg->value.dval = (double) var_arg->fltVal;
+ else
+ pval_arg->value.dval = (double)*(var_arg->pfltVal);
+
pval_arg->type = IS_DOUBLE;
break;
case VT_R8:
- pval_arg->value.dval = var_arg->dblVal;
+ if (pval_arg->is_ref == 0 || (var_arg->vt & VT_BYREF) != VT_BYREF)
+ pval_arg->value.dval = var_arg->dblVal;
+ else
+ pval_arg->value.dval = *(var_arg->pdblVal);
pval_arg->type = IS_DOUBLE;
break;
case VT_BOOL:
-
- if (var_arg->boolVal & 0xFFFF) {
- pval_arg->value.lval = 1;
- } else {
-
- pval_arg->value.lval = 0;
+ if (pval_arg->is_ref == 0 || (var_arg->vt & VT_BYREF) != VT_BYREF)
+ {
+ if (var_arg->boolVal & 0xFFFF) {
+ pval_arg->value.lval = 1;
+ } else {
+ pval_arg->value.lval = 0;
+ }
}
-
+ else
+ {
+ if (*(var_arg->pboolVal) & 0xFFFF) {
+ pval_arg->value.lval = 1;
+ } else {
+ pval_arg->value.lval = 0;
+ }
+ }
pval_arg->type = IS_BOOL;
break;
case VT_BSTR:
- pval_arg->value.str.val = php_OLECHAR_to_char(var_arg->bstrVal,
&pval_arg->value.str.len, persistent);
+ if (pval_arg->is_ref == 0 || (var_arg->vt & VT_BYREF) != VT_BYREF)
+ {
+ pval_arg->value.str.val = php_OLECHAR_to_char(var_arg->bstrVal,
&pval_arg->value.str.len, persistent);
+ SysFreeString(var_arg->bstrVal);
+ }
+ else
+ {
+ pval_arg->value.str.val = php_OLECHAR_to_char(*(var_arg->pbstrVal),
&pval_arg->value.str.len, persistent);
+ SysFreeString(*(var_arg->pbstrVal));
+ efree(var_arg->pbstrVal);
+ }
pval_arg->type = IS_STRING;
break;
case VT_UNKNOWN:
@@ -362,7 +397,7 @@
}
-static void _php3_pval_to_variant(pval *pval_arg, VARIANTARG *var_arg)
+static void php_pval_to_variant(pval *pval_arg, VARIANTARG *var_arg)
{
OLECHAR *unicode_str;
@@ -373,8 +408,16 @@
break;
case IS_LONG:
case IS_BOOL:
- var_arg->vt = VT_I4; // assuming 32-bit platform
- var_arg->lVal = pval_arg->value.lval;
+ if (pval_arg->is_ref == 0)
+ {
+ var_arg->vt = VT_I4; // assuming 32-bit platform
+ var_arg->lVal = pval_arg->value.lval;
+ }
+ else
+ {
+ var_arg->vt = VT_I4 | VT_BYREF; // assuming 32-bit platform
+ var_arg->plVal = &(pval_arg->value.lval);
+ }
break;
case IS_DOUBLE:
var_arg->vt = VT_R8; // assuming 64-bit double precision
@@ -382,15 +425,23 @@
break;
case IS_STRING:
unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
- var_arg->bstrVal = SysAllocString(unicode_str);
- var_arg->vt = VT_BSTR;
+ if (pval_arg->is_ref == 0)
+ {
+ var_arg->bstrVal = SysAllocString(unicode_str);
+ var_arg->vt = VT_BSTR;
+ }
+ else
+ {
+ var_arg->pbstrVal = (BSTR *)emalloc(sizeof(BSTR *));
+ *(var_arg->pbstrVal) = SysAllocString(unicode_str);
+ var_arg->vt = VT_BSTR | VT_BYREF;
+ break;
+ }
efree(unicode_str);
- break;
}
}
-
int do_COM_invoke(IDispatch *i_dispatch, pval *function_name, VARIANTARG *var_result, pval
**arguments, int arg_count)
{
DISPID dispid;
@@ -407,7 +458,7 @@
1, LOCALE_SYSTEM_DEFAULT, &dispid);
if (FAILED(hr)) {
- error_message = _php3_COM_error_message(hr);
+ error_message = php_COM_error_message(hr);
php_error(E_WARNING,"Unable to lookup %s: %s\n", function_name->value.str.val,
error_message);
LocalFree(error_message);
efree(funcname);
@@ -418,7 +469,7 @@
for (current_arg=0; current_arg<arg_count; current_arg++) {
current_variant = arg_count - current_arg - 1;
- _php3_pval_to_variant(arguments[current_arg], &variant_args[current_variant]);
+ php_pval_to_variant(arguments[current_arg], &variant_args[current_variant]);
}
@@ -432,7 +483,7 @@
&dispparams, var_result, NULL, 0);
if (FAILED(hr)) {
- error_message = _php3_COM_error_message(hr);
+ error_message = php_COM_error_message(hr);
php_error(E_WARNING,"Invoke() failed: %s\n", error_message);
LocalFree(error_message);
efree(funcname);
@@ -440,6 +491,14 @@
return FAILURE;
}
+// variant_args = dispparams.rgvarg;
+
+ for (current_arg=0; current_arg<arg_count; current_arg++) {
+ current_variant = arg_count - current_arg - 1;
+ php_variant_to_pval(&variant_args[current_variant], arguments[current_arg], 0);
+ }
+
+
efree(variant_args);
efree(funcname);
return SUCCESS;
@@ -525,7 +584,7 @@
1, LOCALE_SYSTEM_DEFAULT, &dispid);
if (FAILED(hr)) {
- error_message = _php3_COM_error_message(hr);
+ error_message = php_COM_error_message(hr);
php_error(E_WARNING,"Unable to lookup %s: %s\n", arg_property->value.str.val,
error_message);
LocalFree(error_message);
efree(propname);
@@ -543,7 +602,7 @@
&dispparams, var_result, NULL, 0);
if (FAILED(hr)) {
- error_message = _php3_COM_error_message(hr);
+ error_message = php_COM_error_message(hr);
php_error(E_WARNING,"PropGet() failed: %s\n", error_message);
LocalFree(error_message);
efree(propname);
@@ -581,7 +640,7 @@
1, LOCALE_SYSTEM_DEFAULT, &dispid);
if (FAILED(hr)) {
- error_message = _php3_COM_error_message(hr);
+ error_message = php_COM_error_message(hr);
php_error(E_WARNING,"Unable to lookup %s: %s\n", arg_property->value.str.val,
error_message);
LocalFree(error_message);
efree(propname);
@@ -589,7 +648,7 @@
}
- _php3_pval_to_variant(value, &new_value);
+ php_pval_to_variant(value, &new_value);
dispparams.rgvarg = &new_value;
dispparams.rgdispidNamedArgs = &mydispid;
dispparams.cArgs = 1;
@@ -607,7 +666,7 @@
&dispparams, &var_result, NULL, 0);
if (FAILED(hr)) {
- error_message = _php3_COM_error_message(hr);
+ error_message = php_COM_error_message(hr);
php_error(E_WARNING,"PropPut() failed: %s\n", error_message);
LocalFree(error_message);
efree(propname);
Index: php4/ext/session/session.c
diff -u php4/ext/session/session.c:1.61 php4/ext/session/session.c:1.62
--- php4/ext/session/session.c:1.61 Sun Oct 31 08:29:00 1999
+++ php4/ext/session/session.c Sat Nov 6 05:01:54 1999
@@ -891,7 +891,7 @@
zend_hash_init(&PS(vars), 0, NULL, NULL, 0);
PS(define_sid) = 0;
- PS(use_cookies) = INI_INT("session.use_cookies");
+ PS(use_cookies) = INI_BOOL("session.use_cookies");
PS(save_path) = estrdup(INI_STR("session.save_path"));
PS(session_name) = estrdup(INI_STR("session.name"));
PS(entropy_file) = estrdup(INI_STR("session.entropy_file"));
Index: php4/ext/standard/basic_functions.c
diff -u php4/ext/standard/basic_functions.c:1.117 php4/ext/standard/basic_functions.c:1.118
--- php4/ext/standard/basic_functions.c:1.117 Thu Nov 4 16:55:47 1999
+++ php4/ext/standard/basic_functions.c Sat Nov 6 05:01:55 1999
@@ -3153,7 +3153,7 @@
convert_to_long_ex(port);
convert_to_string_ex(proto);
- serv = getservbyport(htons((*port)->value.lval),(*proto)->value.str.val);
+ serv = getservbyport(htons((unsigned short) (*port)->value.lval),(*proto)->value.str.val);
if(serv == NULL)
RETURN_FALSE;