рдкрд╣рд▓реЗ рднрд╛рдЧ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЦрд╛рд▓реА рдХрд░ рджрд┐рдпрд╛, рдЗрд╕реЗ Clion IDE рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛, my_array_fill () рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛, рдФрд░ php рдореЗрдВ рдЗрд╕рдХреА рд╕рдВрдЪрд╛рд▓рди рдХреНрд╖рдорддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреАред
рдЕрдм рдХреНрдпрд╛
рдЕрдм рдореИрдВ libtrie рд▓рд╛рдЗрдмреНрд░реЗрд░реА
рдХреЛрдб рдХреЛ рд╣рдорд╛рд░реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред
рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЖрдк php7 рдореЗрдВ рдкреБрд░рд╛рдиреЗ php5 рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ php рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдп рдХрд░реВрдБрдЧрд╛ рдФрд░ рдЬрд╛рдБрдЪ рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред
рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ
рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рд▓рд┐рдмрд░реНрдЯреА рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдореИрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЬрд╛рддрд╛ рд╣реВрдВ
cd ~/Documents/libtrie/
рд▓рд┐рдмрд░реНрдЯреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░рдирд╛
git clone https:

рдореИрдВ рдлрд╛рдЗрд▓ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрдб
php_libtrie.c
рд╕рд╛рде
php_libtrie.c
рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб
libtrie/src/libtrie.c
рд╕рд╛рде рдлрд╛рдЗрд▓ред

рдореИрдВ рдмрд╛рдж рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
Php I рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╣реА рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╣рдо php_libtrie.c рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
#include "libtrie/src/libtrie.h"
Yatrie_new рдлрд╝рдВрдХреНрд╢рди
рдореИрдВ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
trie_s *yatrie_new(uint32_t max_nodes, uint32_t max_refs, uint32_t max_deallocated_size) {...}
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдкрд░ 3 рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░
trie_s
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрддрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдирд┐рд░реНрдорд┐рдд рдЙрдкрд╕рд░реНрдЧ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рдХреЛ PHP рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, PHP рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕рд╛рдзрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЬрдм PHP рдореЗрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
fopen("filename.ext");
рд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рдмреЛрд▓рддреЗ рд╣реБрдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдФрд░ рдкреАрдПрдЪрдкреА рдХреЗ рдмрд╛рд╣рд░ рд▓реМрдЯрддрд╛ рд╣реИред
рд╣рдо рдЕрдкрдиреЗ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред
рдЪрд▓реЛ php_libtrie.c рдореЗрдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдмрдирд╛рддреЗ рд╣реИрдВ:
рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб PHP_FUNCTION (yatrie_new) { /* */ trie_s *trie; // zend_long max_nodes; // - zend_long max_refs; /* - . * . - +25% . * , OpenCorpora ~3. 5. 5. */ zend_long max_deallocated_size; /* * . 96 , 1 , 95. * 95, , * . 94. */ // PHP if (zend_parse_parameters(ZEND_NUM_ARGS(), "lll", &max_nodes, &max_refs, &max_deallocated_size) == FAILURE) { RETURN_FALSE; } // trie = yatrie_new((uint32_t)max_nodes, (uint32_t)max_refs, (uint32_t)max_deallocated_size); // - if (!trie) { RETURN_NULL(); } // 2 /* zend_register_resource() Zend, * le_libtrie, ZVAL_RES() * zval return_value */ ZVAL_RES(return_value, zend_register_resource(trie, le_libtrie)); }
рдЕрдм рдЖрдкрдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд░рдгреА рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдлрд╝рдВрдХреНрд╢рди PHP рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛ред
PHP_FE(yatrie_new, NULL)

рдЗрд╕реЗ рд╕реБрдВрджрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ PHP рдлрд╝рдВрдХреНрд╢рди рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
рдмрд╕ рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реЗрдВ:
PHP_FUNCTION(confirm_libtrie_compiled)
php_libtrie.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВред рдХрд╣реАрдВ рднреА:
#ifndef PHP_LIBTRIE_H #define PHP_LIBTRIE_H
рдФрд░
#endif

PHP рдиреЗ рд░рд┐рд╕реЛрд░реНрд╕ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрдирд╛рдпрд╛
Yatrie_new () рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЯреНрд░реА рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ PHP рд╕рдВрд╕рд╛рдзрди рдХреЛ рднреА рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдмрдирд╛рдП рдЧрдП рд╕рдВрд╕рд╛рдзрди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЙрдкрд╕рд░реНрдЧ рдкреЗрдбрд╝ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░ рджреЗрдЧрд╛ред
static void php_libtrie_dtor(zend_resource *rsrc TSRMLS_DC) {
рдЪреВрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЙрд╕рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ php_libtrie.h рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

рдЕрдм рдЖрдкрдХреЛ PHP рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрд╕ рддреБрд░рдВрдд SUCCESS рд▓реМрдЯрд╛ред рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЛ рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
// PHP trie PHP_MINIT_FUNCTION (libtrie) { le_libtrie = zend_register_list_destructors_ex( php_libtrie_dtor, NULL, PHP_LIBTRIE_RES_NAME, module_number); return SUCCESS; }

рдмрдирд╛рдпрд╛ рдкреЗрдбрд╝ рд╕рдорд╛рд░реЛрд╣ рд╣рдЯрд╛ рджреЗрдВ
рдЬреИрд╕реЗ
fopen()
рдлрдВрдХреНрд╢рди рдореЗрдВ
fopen()
рдХрд╛ рдПрдХ рдЬреЛрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рд╡реИрд╕реЗ рд╣реА рдореЗрд░реЗ рдЯреНрд░реА рдХреНрд░рд┐рдПрд╢рди рдлрдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЧрд░реНрд▓рдлреНрд░реЗрдВрдб рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕реЗ рдмреИрд▓реЗрдВрд╕ рдХрд░реЗред
рдХреЛрдб /** * @brief * @param trie : resource * @return true/false : bool */ PHP_FUNCTION (yatrie_free) { zval *resource; // zval // if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &resource) == FAILURE) { RETURN_FALSE; } /* , zend_resource, * zval. Z_RES_P() */ if (zend_list_close(Z_RES_P(resource)) == SUCCESS) { // true return_vale return RETURN_TRUE; } // false return_vale return RETURN_FALSE; }
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рд░рдгреА рдореЗрдВ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ:
PHP_FE(yatrie_free, NULL)
рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдЬреЛрдбрд╝реЗрдВ:
PHP_FUNCTION(yatrie_free)

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ PHP рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЖрдВрддрд░рд┐рдХ рдирд╛рдо рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ, рд╕рд╛рде рд╣реА PHP5 рдореИрдХреНрд░реЛрдЬрд╝, рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ PHP7 рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдЙрдирдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ PHP7 рдореЗрдВ PHP5 рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
#define PHP_LIBTRIE_VERSION "0.1.0" #define PHP_LIBTRIE_RES_NAME "libtrie data structure"
рд╕рдорд╛рд░реЛрд╣ trie рдореЗрдВ рд╢рдмреНрдж рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
рдЕрдм рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред
рдХреЛрдб /** * @brief trie node_id * @param trie : resource * @param word : string * @return node_id : int */ PHP_FUNCTION (yatrie_add) { trie_s *trie; // zval *resource; // zval unsigned char *word = NULL; // size_t word_len; // word uint32_t node_id; //id , // if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &resource, &word, &word_len) == FAILURE) { RETURN_FALSE } /* PHP, : * 1 PHP ( zval, ), * 2 * * 3 id , * void *, trie_s * * PHP5 ZEND_FETCH_RESOURCE(), - PHP7. */ trie = (trie_s *) zend_fetch_resource(Z_RES_P(resource), PHP_LIBTRIE_RES_NAME, le_libtrie); /* trie * - * - id , * - . */ node_id = yatrie_add(word, 0, trie); // RETURN_LONG(node_id); }
- рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рд░рдгреА рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝реЗрдВ:
PHP_FE(yatrie_add, NULL)
- рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдШреЛрд╖рдгрд╛ рдЬреЛрдбрд╝реЗрдВ:
PHP_FUNCTION(yatrie_add)
рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рд░реЛрд╣
рдЕрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрд╕рд░реНрдЧ рдкреЗрдбрд╝ рд╕реЗ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ PHP рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ред
рдХреЛрдб /** * @brief , , * , * @param trie : resource * @param node_id : int * @param head () : string , * * @return array */ PHP_FUNCTION (node_traverse) { trie_s *trie; // trie words_s *words; // trie zval * resource; // zval zend_long node_id; // unsigned char *head = NULL; // size_t head_len; // // PHP if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|s", &resource, &node_id, &head, &head_len) == FAILURE) { RETURN_NULL(); // null } // trie = (trie_s *) zend_fetch_resource(Z_RES_P(resource), PHP_LIBTRIE_RES_NAME, le_libtrie); // trie node_traverse() words_s // words = (words_s *) calloc(1, sizeof(words_s)); words->counter = 0; // 0 // 1 string_s *head_libtrie = calloc(1, sizeof(string_s)); // head if(head != NULL) { head_libtrie->length = (uint32_t)head_len; // memcpy(&head_libtrie->letters, head, head_len); // head_libtrie } // trie node_traverse(words, (uint32_t) node_id, head_libtrie, trie); // PHP , words array_init_size(return_value, words->counter); // php while (words->counter--) { // trie , // uint8_t dst[256]; // libtrie decode_string(dst, words->words[words->counter]); // Zend API, php string char * add_next_index_string(return_value, (const char *) dst); } // words head_libtrie free(words); free(head_libtrie); }
- рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рд░рдгреА рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝реЗрдВ:
PHP_FE(node_traverse, NULL)
- рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдШреЛрд╖рдгрд╛ рдЬреЛрдбрд╝реЗрдВ:
PHP_FUNCTION(node_traverse)
рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛
рдЪреВрдВрдХрд┐ рдЕрдм рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ config.m4 рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рд╡рд╣рд╛рдБ 2 libtrie рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВ:
libtrie/src/libtrie.c
libtrie/src/single_list.c
рдпрд╣рд╛рдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдХреА рдкреВрд░реА рд╕рд╛рдордЧреНрд░реА рд╣реИред
config.m4 PHP_ARG_ENABLE(libtrie, whether to enable libtrie support, [ --enable-libtrie Enable libtrie support]) if test "$PHP_LIBTRIE" != "no"; then

рдЕрдм рдЖрдкрдХреЛ ./configure рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ:
phpize && ./configure
рдЕрдм рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
make
рдкрд░реАрдХреНрд╖рдг
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ php рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рддрд╛рдХрд┐ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рди рд▓рд┐рдЦреЗрдВред рдореИрдВ рдпрд╣ рдХрд░реВрдВрдЧрд╛:
nano yatrie_test.php
рдФрд░ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:
<?php echo "C 500 500 \n\n"; $trie = yatrie_new(500, 500, 100); echo "!\n , id \$nodes\n"; $nodes[] = yatrie_add($trie, ""); $nodes[] = yatrie_add($trie, ""); $nodes[] = yatrie_add($trie, ""); echo " .\n 2 , 2.\n 3 , 2 ,\n 1 \n"; print_r($nodes); print_r(node_traverse($trie, 0)); yatrie_free($trie);
рд╣рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
php -d extension=modules/libtrie.so yatrie_test.php
рдпрд╣рд╛рдБ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

рд╣рдо
рдпрд╣рд╛рдВ рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд▓реЗрддреЗ
рд╣реИрдВ ред рд╢рд░реНрдореАрд▓реА рдордд рдмрдиреЛ рдФрд░ рддрд╛рд░рд╛рдВрдХрди рдХрд░реЗрдВ :-)