From b4a53fddb8b52029f8c53094e8747ed2f8cf47b8 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 25 Aug 2014 17:23:05 +0200 Subject: Move some utility funtions to a new header --- src/fastd.h | 36 +------------------------------- src/util.h | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 35 deletions(-) create mode 100644 src/util.h diff --git a/src/fastd.h b/src/fastd.h index 3fe193b..f1825ea 100644 --- a/src/fastd.h +++ b/src/fastd.h @@ -38,6 +38,7 @@ #include "log.h" #include "sem.h" #include "shell.h" +#include "util.h" #include "vector.h" #include @@ -340,41 +341,6 @@ static inline void fastd_setnonblock(int fd) { } -/** - Returns a pointer to a data structure, given the address of a member contained in the structure - - @param ptr the address of the member - @param type the type of the container - @param member the name of the member - - \hideinitializer - */ -#define container_of(ptr, type, member) ({ \ - const __typeof__(((type *)0)->member) *_mptr = (ptr); \ - (type *)((char *)_mptr - offsetof(type, member)); \ - }) - -/** - Returns the number of elements of an array - - \hideinitializer - */ -#define array_size(array) (sizeof(array)/sizeof((array)[0])) - -/** - Determines how many blocks of a given size \a a are needed to contain some length \a l - */ -static inline size_t block_count(size_t l, size_t a) { - return (l+a-1)/a; -} - -/** - Rounds up a length \a l to the next multiple of a block size \a a - */ -static inline size_t alignto(size_t l, size_t a) { - return block_count(l, a)*a; -} - /** Returns the maximum payload size \em fastd is configured to transport */ static inline size_t fastd_max_payload(void) { switch (conf.mode) { diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..e36f028 --- /dev/null +++ b/src/util.h @@ -0,0 +1,68 @@ +/* + Copyright (c) 2012-2014, Matthias Schiffer + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + \file + + \em Miscellaneous utility functions and macros + */ + + +#pragma once + +/** + Returns a pointer to a data structure, given the address of a member contained in the structure + + @param ptr the address of the member + @param type the type of the container + @param member the name of the member + + \hideinitializer + */ +#define container_of(ptr, type, member) ({ \ + const __typeof__(((type *)0)->member) *_mptr = (ptr); \ + (type *)((char *)_mptr - offsetof(type, member)); \ + }) + +/** + Returns the number of elements of an array + + \hideinitializer + */ +#define array_size(array) (sizeof(array)/sizeof((array)[0])) + +/** + Determines how many blocks of a given size \a a are needed to contain some length \a l + */ +static inline size_t block_count(size_t l, size_t a) { + return (l+a-1)/a; +} + +/** + Rounds up a length \a l to the next multiple of a block size \a a + */ +static inline size_t alignto(size_t l, size_t a) { + return block_count(l, a)*a; +} -- cgit v1.2.3