diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-02-16 20:00:43 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-02-16 20:00:43 +0000 |
commit | d4aaffc6e7af3577696f55a1ffbcb6a2f98fbddb (patch) | |
tree | a5a84c69319e287d9b2013e548a416f0203fc251 | |
parent | e5d3269b10754b9b46bc19234bbfabd3e631f733 (diff) | |
download | tor-d4aaffc6e7af3577696f55a1ffbcb6a2f98fbddb.tar.gz tor-d4aaffc6e7af3577696f55a1ffbcb6a2f98fbddb.zip |
r11824@catbus: nickm | 2007-02-16 13:16:47 -0500
Move all struct-offset-manipulation macros into util.h, and use them consistently. Because there are days when "SUBTYPE_P(handle, subtype, _base)" is just easier to read and write than "(basetp*)(((handle) - STRUCT_OFFSET(subtype, _base))".
svn:r9592
-rw-r--r-- | src/common/compat.c | 6 | ||||
-rw-r--r-- | src/common/util.h | 23 | ||||
-rw-r--r-- | src/or/config.c | 12 | ||||
-rw-r--r-- | src/or/or.h | 6 |
4 files changed, 26 insertions, 21 deletions
diff --git a/src/common/compat.c b/src/common/compat.c index 697a32c091..3833c396e8 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -174,8 +174,7 @@ tor_mmap_file(const char *filename) void tor_munmap_file(tor_mmap_t *handle) { - tor_mmap_impl_t *h = (tor_mmap_impl_t*) - (((char*)handle) - STRUCT_OFFSET(tor_mmap_impl_t, base)); + tor_mmap_impl_t *h = SUBTYPE_P(handle, tor_mmap_impl_t, base); munmap((char*)h->base.data, h->mapping_size); tor_free(h); } @@ -244,8 +243,7 @@ tor_mmap_file(const char *filename) void tor_munmap_file(tor_mmap_t *handle) { - win_mmap_t *h = (win_mmap_t*) - (((char*)handle) - STRUCT_OFFSET(win_mmap_t, base)); + win_mmap_t *h = SUBTYPE_P(handle, win_mmap_t, base); if (handle->data) /* This is an ugly cast, but without it, "data" in struct tor_mmap_t would have to be redefined as non-const. */ diff --git a/src/common/util.h b/src/common/util.h index 9c94925004..d64ffb8e88 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -110,6 +110,29 @@ extern int dmalloc_free(const char *file, const int line, void *pnt, ((off_t) (((char*)&((tp*)0)->member)-(char*)0)) #endif +/** Macro: yield a pointer to the field at position <b>off</b> within the + * structure <b>st</b>. Example: + * <pre> + * struct a { int foo; int bar; } x; + * off_t bar_offset = STRUCT_OFFSET(struct a, bar); + * int *bar_p = STRUCT_VAR_P(&x, bar_offset); + * *bar_p = 3; + * </pre> + */ +#define STRUCT_VAR_P(st, off) ((void*) ( ((char*)(st)) + (off) ) ) + +/** Macro: yield a pointer to an enclosing structure given a pointer to + * a substructure at offset <b>off</b>. Example: + * <pre> + * struct base { ... }; + * struct subtype { int x; struct base b; } x; + * struct base *bp = &x.base; + * struct *sp = SUBTYPE_P(bp, struct subtype, b); + * </pre> + */ +#define SUBTYPE_P(p, subtype, basemember) \ + ((void*) ( ((char*)(p)) - STRUCT_OFFSET(subtype, basemember) )) + /* String manipulation */ /** Allowable characters in a hexadecimal string. */ diff --git a/src/or/config.c b/src/or/config.c index 8b1b4909d0..279ddd5bb7 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -102,18 +102,6 @@ typedef struct config_var_t { const char *initvalue; /**< String (or null) describing initial value. */ } config_var_t; -/** Macro: yield a pointer to the field at position <b>off</b> within the - * structure <b>st</b>. Example: - * <pre> - * struct a { int foo; int bar; } x; - * off_t bar_offset = STRUCT_OFFSET(struct a, bar); - * int *bar_p = STRUCT_VAR_P(&x, bar_offset); - * *bar_p = 3; - * </pre> - */ -#define STRUCT_VAR_P(st, off) \ - ((void*) ( ((char*)st) + off ) ) - /** An entry for config_vars: "The option <b>name</b> has type * CONFIG_TYPE_<b>conftype</b>, and corresponds to * or_options_t.<b>member</b>" diff --git a/src/or/or.h b/src/or/or.h index 5c23c9d6b3..3b0669f6e2 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -928,8 +928,7 @@ typedef struct control_connection_t { /** Cast a connection_t subtype pointer to a connection_t **/ #define TO_CONN(c) (&(((c)->_base))) /** Helper macro: Given a pointer to to._base, of type from*, return &to. */ -#define DOWNCAST(to, ptr) \ - (to*) (((char*)(ptr)) - STRUCT_OFFSET(to, _base)) +#define DOWNCAST(to, ptr) ((to*)SUBTYPE_P(ptr, to, _base)) /** Convert a connection_t* to an or_connection_t*; assert if the cast is * invalid. */ @@ -1515,14 +1514,11 @@ static origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *); static INLINE or_circuit_t *TO_OR_CIRCUIT(circuit_t *x) { tor_assert(x->magic == OR_CIRCUIT_MAGIC); - //return (or_circuit_t*) (((char*)x) - STRUCT_OFFSET(or_circuit_t, _base)); return DOWNCAST(or_circuit_t, x); } static INLINE origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *x) { tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC); - //return (origin_circuit_t*) - // (((char*)x) - STRUCT_OFFSET(origin_circuit_t, _base)); return DOWNCAST(origin_circuit_t, x); } |