hello,
here is a modification I made to the sablotron module in php enabling
the use of scheme handlers with an additional function called
xslt_add_schme_handler.
I am using it and found it usefull for multi document handling in xslt.
bye,
carmelo
Index: ./ext/sablot/php_sablot.h
===================================================================
RCS file: /repository/php4/ext/sablot/php_sablot.h,v
retrieving revision 1.11
diff -r1.11 php_sablot.h
54a55
> PHP_FUNCTION(xslt_set_scheme_handler);
86c87
<
---
>
98c99,102
<
---
>
> /* Scheme Handling */
> zval *getAllHandler;
>
145a150
>
Index: ./ext/sablot/sablot.c
===================================================================
RCS file: /repository/php4/ext/sablot/sablot.c,v
retrieving revision 1.28
diff -r1.28 sablot.c
56a57,64
> /* Scheme Handling Functions */
> static int _php_sablot_sh_getAll(void *userData, SablotHandle p, const char
>*scheme, const char *rest, char **buffer, int *byteCount);
> static int _php_sablot_sh_freeMemory(void *userData, SablotHandle p, char *buffer);
> static int _php_sablot_sh_open(void *userData, SablotHandle p, const char *scheme,
>const char *rest, int *handle);
> static int _php_sablot_sh_get(void *userData, SablotHandle p, int handle, char
>*buffer, int *byteCount);
> static int _php_sablot_sh_put(void *userData, SablotHandle p, int handle, const
>char *buffer, int *byteCount);
> static int _php_sablot_sh_close(void *userData, SablotHandle p, int handle);
>
66c74
< #define FUNCH_FREE(__var) if (__var) zval_del_ref(&(__var));
---
> #define FUNCH_FREE(__var) if (__var) zval_del_ref(&(__var));
104c112
< * called when Sablotron's internal expat parser reaches the
---
> * called when Sablotron's internal expat parser reaches the
130a139,151
> /**
> * Scheme Handler structure for use when Sablotron
> * call rhe document Xpath function.
> */
> static SchemeHandler sh = {
> _php_sablot_sh_getAll,
> _php_sablot_sh_freeMemory,
> _php_sablot_sh_open,
> _php_sablot_sh_get,
> _php_sablot_sh_put,
> _php_sablot_sh_close
> };
>
151a173
> PHP_FE(xslt_set_scheme_handler, NULL)
233c255
<
---
>
236c258
<
---
>
242c264
<
---
>
245c267
<
---
>
263c285
<
---
>
268c290
< /**
---
> /**
282c304
<
---
>
284,285c306,307
<
< ret = SablotRunProcessor(SABLOT_BASIC_HANDLE,
SABLOTG(output_transform_file),
---
>
> ret = SablotRunProcessor(SABLOT_BASIC_HANDLE, SABLOTG(output_transform_file),
287c309
<
---
>
293c315
<
---
>
295c317
<
---
>
307c329
< */
---
> */
313c335
<
---
>
316c338
< * current output buffer (so we don't send data twice)
---
> * current output buffer (so we don't send data twice)
320c342
<
---
>
322c344
<
---
>
342,343c364,365
< zval **xslt_uri,
< **transform_uri,
---
> zval **xslt_uri,
> **transform_uri,
345,346c367,368
< **xslt_params,
< **xslt_args,
---
> **xslt_params,
> **xslt_args,
353c375
< int argc = ZEND_NUM_ARGS(),
---
> int argc = ZEND_NUM_ARGS(),
357c379
<
---
>
363c385
<
---
>
365c387
< * if there are more than 3 function arguments, inspect the value of
---
> * if there are more than 3 function arguments, inspect the value of
372c394
< int numelems,
---
> int numelems,
383c405
<
---
>
386c408
<
---
>
388c410
< * Translate a PHP array (HashTable *) into a
---
> * Translate a PHP array (HashTable *) into a
394c416
<
---
>
403c425
< int numelems,
---
> int numelems,
408c430
<
---
>
411c433
<
---
>
415c437
<
---
>
417,418c439,440
< ret = SablotRunProcessor(SABLOT_BASIC_HANDLE, Z_STRVAL_PP(xslt_uri),
< Z_STRVAL_PP(transform_uri), Z_STRVAL_PP(result_uri),
---
> ret = SablotRunProcessor(SABLOT_BASIC_HANDLE, Z_STRVAL_PP(xslt_uri),
> Z_STRVAL_PP(transform_uri), Z_STRVAL_PP(result_uri),
423c445
<
---
>
426c448
<
---
>
429c451
<
---
>
431c453
<
---
>
434c456
<
---
>
437c459
<
---
>
440c462
<
---
>
448c470
<
---
>
451c473
<
---
>
461,463c483,485
< zval **xslt,
< **input,
< **result,
---
> zval **xslt,
> **input,
> **result,
466c488
< int ret = 0,
---
> int ret = 0,
469c491
<
---
>
475c497
<
---
>
477c499
<
---
>
484c506
<
---
>
487c509
<
---
>
497,499c519,521
<
< ret = SablotRunProcessor(SABLOT_BASIC_HANDLE, "arg:/_stylesheet",
< "arg:/_xmlinput", "arg:/_output",
---
>
> ret = SablotRunProcessor(SABLOT_BASIC_HANDLE, "arg:/_stylesheet",
> "arg:/_xmlinput", "arg:/_output",
502c524
<
---
>
507c529
<
---
>
512c534
<
---
>
516c538
<
---
>
534c556
<
---
>
536c558
<
---
>
541c563
<
---
>
548c570
<
---
>
551c573
<
---
>
558c580
<
---
>
563c585,592
<
---
>
> ret = SablotRegHandler(handle->p, HLR_SCHEME, (void *)&sh, (void *)handle);
>
> if (ret) {
> SABLOTG(last_errno) = ret;
> RETURN_FALSE;
> }
>
573,577c602,606
< zval **xh,
< **xslt_file,
< **data_file,
< **xslt_result,
< **xslt_params,
---
> zval **xh,
> **xslt_file,
> **data_file,
> **xslt_result,
> **xslt_params,
586c615
<
---
>
593c622
<
---
>
597c626
<
---
>
602,603c631,632
<
< if (argc > 4) {
---
>
> if (argc > 4) {
608c637
<
---
>
611c640
<
---
>
614c643
<
---
>
618c647
<
---
>
624c653
<
---
>
627c656
<
---
>
630c659
<
---
>
634c663
<
---
>
636c665
<
---
>
645c674
<
---
>
649c678
<
---
>
658,659c687,688
< zval **xh,
< **logfile,
---
> zval **xh,
> **logfile,
662,663c691,692
< int ret = 0,
< loglevel = 0,
---
> int ret = 0,
> loglevel = 0,
666c695
<
---
>
673c702
<
---
>
678c707
<
---
>
680c709
<
---
>
699c728
<
---
>
705c734
<
---
>
707c736
<
---
>
711c740
< RETURN_TRUE;
---
> RETURN_TRUE;
719c748
< zval **xh,
---
> zval **xh,
722c751
< char *value = NULL,
---
> char *value = NULL,
724c753
< int argc = ZEND_NUM_ARGS(),
---
> int argc = ZEND_NUM_ARGS(),
733c762
<
---
>
740c769
<
---
>
742c771
<
---
>
744c773
<
---
>
753c782
<
---
>
768c797
<
---
>
773c802
<
---
>
783,784c812,813
< zval **xh,
< **handlers,
---
> zval **xh,
> **handlers,
791c820
<
---
>
796a826,830
>
> if ((*handlers)->type != IS_ARRAY) {
> php_error(E_ERROR, "The second parameter must be an array");
> }
>
798c832
<
---
>
800c834
<
---
>
804c838
<
---
>
806c840
<
---
>
811c845
<
---
>
813c847
< _php_sablot_handler_pair(handle,
---
> _php_sablot_handler_pair(handle,
817,818c851,852
< _php_sablot_handler_pair(handle,
< &handle->startElementHandler,
&handle->endElementHandler,
---
> _php_sablot_handler_pair(handle,
> &handle->startElementHandler,
>&handle->endElementHandler,
822c856
< &handle->startNamespaceHandler,
&handle->endNamespaceHandler,
---
> &handle->startNamespaceHandler,
>&handle->endNamespaceHandler,
833c867
< } else {
---
> } else {
840a875,922
> /* {{{ proto void xslt_set_scheme_handler(resource xh, array handlers)
> Set SAX Handlers on the resource handle given by xh. */
> PHP_FUNCTION(xslt_set_scheme_handler)
> {
> zval **xh,
> **handlers,
> **indiv_handlers;
> php_sablot *handle;
> HashTable *handlers_list;
> char *string_key = NULL;
> ulong num_key;
> SABLOTLS_FETCH();
>
> if (ZEND_NUM_ARGS() != 2 ||
> zend_get_parameters_ex(2, &xh, &handlers) == FAILURE) {
> WRONG_PARAM_COUNT;
> }
>
> if ((*handlers)->type != IS_ARRAY) {
> php_error(E_ERROR, "The second parameter must be an array");
> }
>
> ZEND_FETCH_RESOURCE(handle, php_sablot *, xh, -1, "PHP-Sablotron Handle",
>le_sablot);
>
> handlers_list = HASH_OF(*handlers);
>
> for (zend_hash_internal_pointer_reset(handlers_list);
> zend_hash_get_current_data(handlers_list, (void **)&indiv_handlers) ==
>SUCCESS;
> zend_hash_move_forward(handlers_list)) {
>
> SEPARATE_ZVAL(indiv_handlers);
>
> if (zend_hash_get_current_key(handlers_list, &string_key, &num_key, 0) ==
>HASH_KEY_IS_LONG) {
> php_error(E_WARNING, "The Keys of the first dimension of your array must
>be strings");
> RETURN_FALSE;
> }
>
> if (!strcasecmp("getall", string_key)) {
> zval_add_ref(indiv_handlers);
> handle->getAllHandler = *indiv_handlers;
> } else {
> php_error(E_WARNING, "Invalid option: %s", string_key);
> }
>
> }
> }
> /* }}} */
>
849,850c931,932
< int ret = 0,
< loglevel = 0,
---
> int ret = 0,
> loglevel = 0,
853c935
<
---
>
860c942
<
---
>
882c964
<
---
>
887c969
<
---
>
896c978
<
---
>
906c988
<
---
>
923c1005
<
---
>
930c1012
<
---
>
949c1031
<
---
>
954c1036
<
---
>
958c1040
<
---
>
961c1043
<
---
>
966c1048
<
---
>
969c1051
<
---
>
988c1070
<
---
>
991c1073
<
---
>
1019c1101
<
---
>
1023c1105
<
---
>
1026c1108
<
---
>
1033c1115
< /* {{{ _php_sablot_startDoc()
---
> /* {{{ _php_sablot_startDoc()
1048c1130
< /* {{{ _php_sablot_sax_startElement()
---
> /* {{{ _php_sablot_sax_startElement()
1053c1135
<
---
>
1056c1138
<
---
>
1069c1151
<
---
>
1073c1155
<
---
>
1079c1161
< /* {{{ _php_sablot_sax_endElement()
---
> /* {{{ _php_sablot_sax_endElement()
1087c1169
<
---
>
1090c1172
<
---
>
1096c1178
< /* {{{ _php_sablot_sax_startNamespace()
---
> /* {{{ _php_sablot_sax_startNamespace()
1101c1183
<
---
>
1104c1186
<
---
>
1108c1190
<
---
>
1114c1196
< /* {{{ _php_sablot_sax_endNamespace()
---
> /* {{{ _php_sablot_sax_endNamespace()
1119c1201
<
---
>
1122c1204
<
---
>
1125c1207
<
---
>
1131c1213
< /* {{{ _php_sablot_sax_comment()
---
> /* {{{ _php_sablot_sax_comment()
1136c1218
<
---
>
1139c1221
<
---
>
1142c1224
<
---
>
1148c1230
< /* {{{ _php_sablot_sax_PI()
---
> /* {{{ _php_sablot_sax_PI()
1153c1235
<
---
>
1156c1238
<
---
>
1160c1242
<
---
>
1166c1248
< /* {{{ _php_sablot_sax_characters()
---
> /* {{{ _php_sablot_sax_characters()
1171c1253
<
---
>
1174c1256
<
---
>
1177c1259
<
---
>
1183c1265
< /* {{{ _php_sablot_sax_endDoc()
---
> /* {{{ _php_sablot_sax_endDoc()
1188c1270
<
---
>
1191c1273
<
---
>
1193c1275
<
---
>
1204c1286
< /* {{{ _php_sablot_make_code()
---
> /* {{{ _php_sablot_make_code()
1218c1300
<
---
>
1221c1303
<
---
>
1223c1305
<
---
>
1231c1313
<
---
>
1234c1316
<
---
>
1237c1319
<
---
>
1242c1324
<
---
>
1244c1326
<
---
>
1247c1329
<
---
>
1250c1332
<
---
>
1258c1340
<
---
>
1260c1342
<
---
>
1263c1345
<
---
>
1266c1348
<
---
>
1271c1353
<
---
>
1275c1357
<
---
>
1280c1362
<
---
>
1284c1366
<
---
>
1286c1368
<
---
>
1289c1371
<
---
>
1293c1375
<
---
>
1300c1382
<
---
>
1310c1392
<
---
>
1347c1429
<
---
>
1351,1352c1433,1434
<
< /**
---
>
> /**
1360c1442
<
---
>
1362c1444
<
---
>
1366c1448
<
---
>
1369c1451
< case MH_LEVEL_ERROR:
---
> case MH_LEVEL_ERROR:
1379a1462,1536
> /* {{{ Sablotron Scheme Handler functions */
>
> static int _php_sablot_sh_getAll(void *userData, SablotHandle p, const char *scheme,
>const char *rest, char **buffer, int *byteCount) {
> php_sablot *handle = (php_sablot *)userData;
>
> if (handle->getAllHandler) {
> zval *retval;
> zval *args[4];
> char *mybuff;
> int i;
> int argc;
>
> argc=4;
> args[0] = _php_sablot_resource_zval(handle->index);
> args[1] = _php_sablot_string_zval(scheme);
> args[2] = _php_sablot_string_zval(rest);
> args[3] = _php_sablot_string_zval("");
>
> MAKE_STD_ZVAL(retval);
>
> if (call_user_function(EG(function_table), NULL, handle->getAllHandler,
>retval, argc, args) == FAILURE) {
> php_error(E_WARNING, "Sorry, couldn't call %s handler", "scheme
>getAll");
> }
>
> zval_dtor(retval);
> efree(retval);
>
> /**
> * do not destroy xml data.
> */
> *buffer=Z_STRVAL_P(args[3]);
> *byteCount=Z_STRLEN_P(args[3]);
> /**
> * destroy zvals
> */
> for (i=0; i<3; i++) {
> zval_del_ref(&(args[i]));
> }
> }
> };
>
> static int _php_sablot_sh_freeMemory(void *userData, SablotHandle p, char *buffer) {
> /**
> * here we should destroy the buffer containing the xml data
> * buffer to zval and zval-del_ref
> * we should destroy the zval not the pointer.
> */
> };
>
> static int _php_sablot_sh_open(void *userData, SablotHandle p, const char *scheme,
>const char *rest, int *handle) {
> /**
> * Not implemented
> */
> };
>
> static int _php_sablot_sh_get(void *userData, SablotHandle p, int handle, char
>*buffer, int *byteCount) {
> /**
> * Not implemented
> */
> };
>
> static int _php_sablot_sh_put(void *userData, SablotHandle p, int handle, const char
>*buffer, int *byteCount) {
> /**
> * Not implemented
> */
> };
>
> static int _php_sablot_sh_close(void *userData, SablotHandle p, int handle) {
> /**
> * Not implemented
> */
> };
>
> /* }}} */
>
1389a1547
> SablotUnregHandler(handle->p, HLR_SCHEME, NULL, NULL);
1392c1550
<
---
>
1401a1560
> FUNCH_FREE(handle->getAllHandler);
1420c1579
<
---
>
1426c1585
<
---
>
1448c1607
<
---
>
1463c1622
<
---
>
1466c1625
<
---
>
1484a1644
>
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]