@@ -409,6 +409,7 @@ cdef extern from "blosc2.h":
409409
410410 ctypedef struct blosc2_filter:
411411 uint8_t id
412+ char * name
412413 blosc2_filter_forward_cb forward
413414 blosc2_filter_backward_cb backward
414415
@@ -1835,20 +1836,35 @@ cdef int general_backward(const uint8_t* input_buffer, uint8_t* output_buffer, i
18351836 return BLOSC2_ERROR_SUCCESS
18361837
18371838
1838- def register_filter (id , forward , backward ):
1839+ def register_filter (id , forward , backward , filter_name ):
18391840 if id < BLOSC2_USER_REGISTERED_FILTERS_START or id > BLOSC2_USER_REGISTERED_FILTERS_STOP:
18401841 raise ValueError (" `id` must be between " , BLOSC2_USER_REGISTERED_FILTERS_START,
18411842 " and " , BLOSC2_USER_REGISTERED_FILTERS_STOP)
1843+ if (forward is None and backward is not None ) or (forward is not None and backward is None ):
1844+ raise ValueError (" both encoder and decoder must be given, or none" )
18421845
18431846 cdef blosc2_filter filter
18441847 filter .id = id
1845- filter .forward = general_forward
1846- filter .backward = general_backward
1848+ if forward is None :
1849+ filter .forward = NULL
1850+ else :
1851+ filter .forward = general_forward
1852+ if backward is None :
1853+ filter .backward = NULL
1854+ else :
1855+ filter .backward = general_backward
1856+ if filter_name is None and not forward and not backward:
1857+ raise ValueError (" You need to pass the filter name or the forward and backward functions" )
1858+ if filter_name:
1859+ filter_name_ = filter_name.encode() if isinstance (filter_name, str ) else filter_name
1860+ filter .name = < char * > malloc(strlen(filter_name_) + 1 )
1861+ strcpy(filter .name, filter_name_)
1862+
18471863 rc = blosc2_register_filter(& filter )
18481864 if rc < 0 :
18491865 raise RuntimeError (" Error while registering filter" )
1850-
1851- blosc2.ufilters_registry[id ] = (forward, backward)
1866+ if forward and backward:
1867+ blosc2.ufilters_registry[id ] = (forward, backward)
18521868
18531869def _check_rc (rc , message ):
18541870 if rc < 0 :
0 commit comments