Предоставляет ли libxml2 (C API) способ удаления зарегистрированного набора xmlOutputCallbacks, не удаляя ВСЕ зарегистрированные выходные обратные вызовы? - PullRequest
0 голосов
/ 07 января 2020

Я работаю над настраиваемым слоем ввода / вывода для libxml2 и натолкнулся на странность в отмене регистрации обратных вызовов Output. Кажется, нет никакого способа удалить только один набор выходных обратных вызовов. Я что-то пропустил? Я могу привести рабочий пример, если следующий псевдокод не проясняет вопрос.

static int _in_matcher(const char* URI)  {...}
static void* _in_opener(const char* URI) {...}
static int _in_reader(void *ctxt, char *in_buf, int buf_len) {...}
static int _in_closer(void *ctxt) {...}

int test_input_callbacks(const char *file_name)
{
    int handler = xmlRegisterInputCallbacks(
      _in_matcher,
      _in_opener,
      _in_reader,
      _in_closer,
    );

    ...
    xmlDocPtr doc = xmlParseFile(file_name);
    xmlFree(doc);
    ...
    xmlPopInputCallbacks();
}


static int   _out_matcher( const char *URI) {...}
static void* _out_opener( const char *URI) {...}
static int   _out_writer( void *ctxt, const char *out_buf, int buf_len) {...}
static int   _outcloser( void *ctxt) {...}

int test_output_callbacks(const char *file_name)
{
    int handler = xmlRegisterOutputCallbacks(
      _out_matcher,
      _out_opener,
      _out_writer,
      _out_closer,
    );

    ...
    int result = xmlSaveFormatFileEnc(URI, doc, NULL, 0);
    xmlFree(doc);
    ...

    /* There does not appear to be a function that 
    * removes _only_ the last output callbacks
    * registered!
    */
    ==> ?? xmlPopOutputCallbacks() ?? <==
}

В качестве обходного пути я добавил эту функцию в свою [локальную] версию libxml2 (2-2.9.10 ):

int
xmlPopOutputCallbacks(void)
{                                                                                                                                                                                 
    if (!xmlOutputCallbackInitialized)
        return(-1);

    if (xmlOutputCallbackNr <= 0)
        return(-1);

    xmlOutputCallbackNr--;
    xmlOutputCallbackTable[xmlOutputCallbackNr].matchcallback = NULL;
    xmlOutputCallbackTable[xmlOutputCallbackNr].opencallback = NULL;
    xmlOutputCallbackTable[xmlOutputCallbackNr].writecallback = NULL;
    xmlOutputCallbackTable[xmlOutputCallbackNr].closecallback = NULL;

    return(xmlOutputCallbackNr);
}

Это работает, но у меня появляется ноющее чувство, что я что-то упускаю; или есть веская причина, по которой libxml2 не предоставляет возможность удалять отдельные наборы обратных вызовов.

Любая помощь / совет будет принята с благодарностью!

Спасибо,

Том

...