summaryrefslogtreecommitdiff
path: root/src/htslib.c
diff options
context:
space:
mode:
authorXavier Roche <xroche@users.noreply.github.com>2014-05-18 13:43:09 +0000
committerXavier Roche <xroche@users.noreply.github.com>2014-05-18 13:43:09 +0000
commit03edb3eac85c6885d5bafd6fb68d3adb0cea4a22 (patch)
treee6cb099a2619136cc2d26a1e6e5d6238413e1b93 /src/htslib.c
parentfe7ea8b140aebdff88d171ca57650917905c6639 (diff)
Cleanup in callbacks.
Diffstat (limited to 'src/htslib.c')
-rw-r--r--src/htslib.c100
1 files changed, 44 insertions, 56 deletions
diff --git a/src/htslib.c b/src/htslib.c
index 886d8e3..ab83837 100644
--- a/src/htslib.c
+++ b/src/htslib.c
@@ -5788,68 +5788,56 @@ const t_hts_htmlcheck_callbacks default_callbacks = {
{htsdefault_parse, NULL}
};
-#define CHARCAST(A) ( (char*) (A) )
-#define OFFSET_OF(TYPE, MEMBER) ( (size_t) ( CHARCAST(&(((TYPE*) NULL)->MEMBER)) - CHARCAST((TYPE*) NULL) ) )
-#define CALLBACK_REF(name, fun) \
- { name, OFFSET_OF(t_hts_htmlcheck_callbacks, fun) }
-#define MEMBER_OF(STRUCT, OFFSET, TYPE) ( * ((TYPE*)((char*)(STRUCT) + (OFFSET))) )
-
-const t_hts_callback_ref default_callbacks_ref[] = {
- CALLBACK_REF("init", init),
- CALLBACK_REF("free", uninit),
- CALLBACK_REF("start", start),
- CALLBACK_REF("end", end),
- CALLBACK_REF("change-options", chopt),
- CALLBACK_REF("preprocess-html", preprocess),
- CALLBACK_REF("postprocess-html", postprocess),
- CALLBACK_REF("check-html", check_html),
- CALLBACK_REF("query", query),
- CALLBACK_REF("query2", query2),
- CALLBACK_REF("query3", query3),
- CALLBACK_REF("loop", loop),
- CALLBACK_REF("check-link", check_link),
- CALLBACK_REF("check-mime", check_mime),
- CALLBACK_REF("pause", pause),
- CALLBACK_REF("save-file", filesave),
- CALLBACK_REF("save-file2", filesave2),
- CALLBACK_REF("link-detected", linkdetected),
- CALLBACK_REF("link-detected2", linkdetected2),
- CALLBACK_REF("transfer-status", xfrstatus),
- CALLBACK_REF("save-name", savename),
- CALLBACK_REF("send-header", sendhead),
- CALLBACK_REF("receive-header", receivehead),
- {NULL, 0}
-};
-
-size_t hts_get_callback_offs(const char *name) {
- const t_hts_callback_ref *ref;
-
- for(ref = &default_callbacks_ref[0]; ref->name != NULL; ref++) {
- if (strcmp(name, ref->name) == 0) {
- return ref->offset;
- }
- }
- return (size_t) (-1);
-}
+#define CALLBACK_OP(CB, NAME, OPERATION, S, FUN) do { \
+ if (strcmp(NAME, S) == 0) { \
+ OPERATION(t_hts_htmlcheck_ ##FUN, (CB)->FUN.fun); \
+ } \
+} while(0)
+
+#define DISPATCH_CALLBACK(CB, NAME, OPERATION) do { \
+ CALLBACK_OP(CB, NAME, OPERATION, "init", init); \
+ CALLBACK_OP(CB, NAME, OPERATION, "free", uninit); \
+ CALLBACK_OP(CB, NAME, OPERATION, "start", start); \
+ CALLBACK_OP(CB, NAME, OPERATION, "end", end); \
+ CALLBACK_OP(CB, NAME, OPERATION, "change-options", chopt); \
+ CALLBACK_OP(CB, NAME, OPERATION, "preprocess-html", preprocess); \
+ CALLBACK_OP(CB, NAME, OPERATION, "postprocess-html", postprocess); \
+ CALLBACK_OP(CB, NAME, OPERATION, "check-html", check_html); \
+ CALLBACK_OP(CB, NAME, OPERATION, "query", query); \
+ CALLBACK_OP(CB, NAME, OPERATION, "query2", query2); \
+ CALLBACK_OP(CB, NAME, OPERATION, "query3", query3); \
+ CALLBACK_OP(CB, NAME, OPERATION, "loop", loop); \
+ CALLBACK_OP(CB, NAME, OPERATION, "check-link", check_link); \
+ CALLBACK_OP(CB, NAME, OPERATION, "check-mime", check_mime); \
+ CALLBACK_OP(CB, NAME, OPERATION, "pause", pause); \
+ CALLBACK_OP(CB, NAME, OPERATION, "save-file", filesave); \
+ CALLBACK_OP(CB, NAME, OPERATION, "save-file2", filesave2); \
+ CALLBACK_OP(CB, NAME, OPERATION, "link-detected", linkdetected); \
+ CALLBACK_OP(CB, NAME, OPERATION, "link-detected2", linkdetected2); \
+ CALLBACK_OP(CB, NAME, OPERATION, "transfer-status", xfrstatus); \
+ CALLBACK_OP(CB, NAME, OPERATION, "save-name", savename); \
+ CALLBACK_OP(CB, NAME, OPERATION, "send-header", sendhead); \
+ CALLBACK_OP(CB, NAME, OPERATION, "receive-header", receivehead); \
+} while(0)
int hts_set_callback(t_hts_htmlcheck_callbacks * callbacks, const char *name,
void *function) {
- size_t offs = hts_get_callback_offs(name);
-
- if (offs != (size_t) - 1) {
- MEMBER_OF(callbacks, offs, void *) = function;
-
- return 0;
- }
- return 1;
+ int error = 1;
+#define CALLBACK_OPERATION(TYPE, FUNCTION) do { \
+ FUNCTION = (TYPE) function; \
+ error = 0; \
+ } while(0)
+ DISPATCH_CALLBACK(callbacks, name, CALLBACK_OPERATION);
+#undef CALLBACK_OPERATION
+ return error;
}
void *hts_get_callback(t_hts_htmlcheck_callbacks * callbacks, const char *name) {
- size_t offs = hts_get_callback_offs(name);
-
- if (offs != (size_t) - 1) {
- return MEMBER_OF(callbacks, offs, void *);
- }
+#define CALLBACK_OPERATION(TYPE, FUNCTION) do { \
+ return (void*) FUNCTION; \
+ } while(0)
+ DISPATCH_CALLBACK(callbacks, name, CALLBACK_OPERATION);
+#undef CALLBACK_OPERATION
return NULL;
}