diff --git a/Makefile-libglnx.am b/Makefile-libglnx.am index 712e931c0554802a296c607e62b376e89b13f400..2e8da015365c29030c4791977bffe5f1df2e4644 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 0000000000000000000000000000000000000000..b0bf6a65abc03cae9dc091cf822b9280510736dd --- /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 diff --git a/libglnx.h b/libglnx.h index 9bd41c45decdf1754adfce96b825fb3c0f1f2fc1..451740d2acbb805d5fb05d7c91348160448d1292 100644 --- a/libglnx.h +++ b/libglnx.h @@ -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>