From 2ca280f0124eddcac8aa868fdbeb679bb6e57139 Mon Sep 17 00:00:00 2001 From: Colin Walters <walters@verbum.org> Date: Sun, 24 Jan 2016 10:06:24 -0500 Subject: [PATCH] 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. --- Makefile-libglnx.am | 1 + glnx-alloca.h | 47 +++++++++++++++++++++++++++++++++++++++++++++ libglnx.h | 1 + 3 files changed, 49 insertions(+) create mode 100644 glnx-alloca.h diff --git a/Makefile-libglnx.am b/Makefile-libglnx.am index 712e931c0..2e8da0153 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 000000000..b0bf6a65a --- /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 9bd41c45d..451740d2a 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> -- GitLab