diff options
author | Colin Walters <walters@verbum.org> | 2016-01-24 10:06:24 -0500 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2016-01-24 12:10:26 -0500 |
commit | 2ca280f0124eddcac8aa868fdbeb679bb6e57139 (patch) | |
tree | 53c53fcf4683897b50423b6d97f82934c760985c | |
parent | 194eb7a09c8baa61e9715a117d9376d43d9a86c5 (diff) | |
download | libglnx-2ca280f0124eddcac8aa868fdbeb679bb6e57139.tar.gz |
Introduce glnx-alloca.h with glnx_strjoina()
This is taken from systemd, and is really useful when one has a few
known-to-be-small strings one wants to concatenate without resorting
to malloc.
-rw-r--r-- | Makefile-libglnx.am | 1 | ||||
-rw-r--r-- | glnx-alloca.h | 47 | ||||
-rw-r--r-- | libglnx.h | 1 |
3 files changed, 49 insertions, 0 deletions
diff --git a/Makefile-libglnx.am b/Makefile-libglnx.am index 712e931..2e8da01 100644 --- a/Makefile-libglnx.am +++ b/Makefile-libglnx.am @@ -18,6 +18,7 @@ EXTRA_DIST += $(libglnx_srcpath)/README.md $(libglnx_srcpath)/COPYING libglnx_la_SOURCES = \ + $(libglnx_srcpath)/glnx-alloca.h \ $(libglnx_srcpath)/glnx-backport-autocleanups.h \ $(libglnx_srcpath)/glnx-backport-autoptr.h \ $(libglnx_srcpath)/glnx-backports.h \ diff --git a/glnx-alloca.h b/glnx-alloca.h new file mode 100644 index 0000000..b0bf6a6 --- /dev/null +++ b/glnx-alloca.h @@ -0,0 +1,47 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2014,2015 Colin Walters <walters@verbum.org>. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#include <stdlib.h> +#include <glib.h> + +G_BEGIN_DECLS + +/* Taken from https://github.com/systemd/systemd/src/basic/string-util.h + * at revision v228-666-gcf6c8c4 + */ +#define glnx_strjoina(a, ...) \ + ({ \ + const char *_appendees_[] = { a, __VA_ARGS__ }; \ + char *_d_, *_p_; \ + int _len_ = 0; \ + unsigned _i_; \ + for (_i_ = 0; _i_ < G_N_ELEMENTS(_appendees_) && _appendees_[_i_]; _i_++) \ + _len_ += strlen(_appendees_[_i_]); \ + _p_ = _d_ = alloca(_len_ + 1); \ + for (_i_ = 0; _i_ < G_N_ELEMENTS(_appendees_) && _appendees_[_i_]; _i_++) \ + _p_ = stpcpy(_p_, _appendees_[_i_]); \ + *_p_ = 0; \ + _d_; \ + }) + + +G_END_DECLS @@ -24,6 +24,7 @@ G_BEGIN_DECLS +#include <glnx-alloca.h> #include <glnx-local-alloc.h> #include <glnx-backport-autocleanups.h> #include <glnx-backports.h> |