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]

Reply via email to