]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-id128: add compound literal love to sd_id128_to_string() + id128_to_uuid_string()
authorLennart Poettering <lennart@poettering.net>
Fri, 20 Aug 2021 08:51:53 +0000 (10:51 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 20 Aug 2021 09:09:48 +0000 (11:09 +0200)
man/rules/meson.build
man/sd_id128_to_string.xml
src/libsystemd/sd-id128/id128-util.h
src/systemd/sd-id128.h

index 8c2217383a9228b4971227bf69ad22142cf7f63e..c6f343d8e5a78d81aa9dfa14d3a50014224f9f0f 100644 (file)
@@ -633,7 +633,10 @@ manpages = [
    'sd_id128_get_machine_app_specific'],
   ''],
  ['sd_id128_randomize', '3', [], ''],
- ['sd_id128_to_string', '3', ['sd_id128_from_string'], ''],
+ ['sd_id128_to_string',
+  '3',
+  ['SD_ID128_STRING_MAX', 'SD_ID128_TO_STRING', 'sd_id128_from_string'],
+  ''],
  ['sd_is_fifo',
   '3',
   ['sd_is_mq',
index 469768050bdae74a2837b1962301d03d83f022e1..db64bc018d1b3a2b225e097df60b33129b51af2f 100644 (file)
@@ -17,7 +17,9 @@
 
   <refnamediv>
     <refname>sd_id128_to_string</refname>
+    <refname>SD_ID128_TO_STRING</refname>
     <refname>sd_id128_from_string</refname>
+    <refname>SD_ID128_STRING_MAX</refname>
     <refpurpose>Format or parse 128-bit IDs as strings</refpurpose>
   </refnamediv>
 
     <funcsynopsis>
       <funcsynopsisinfo>#include &lt;systemd/sd-id128.h&gt;</funcsynopsisinfo>
 
+      <funcsynopsisinfo>#define SD_ID128_STRING_MAX 33U</funcsynopsisinfo>
+
+      <funcsynopsisinfo>#define SD_ID128_TO_STRING(id) …</funcsynopsisinfo>
+
       <funcprototype>
         <funcdef>char *<function>sd_id128_to_string</function></funcdef>
-        <paramdef>sd_id128_t <parameter>id</parameter>, char <parameter>s</parameter>[33]</paramdef>
+        <paramdef>sd_id128_t <parameter>id</parameter>, char <parameter>s</parameter>[static SD_ID128_STRING_MAX]</paramdef>
       </funcprototype>
 
       <funcprototype>
   <refsect1>
     <title>Description</title>
 
-    <para><function>sd_id128_to_string()</function> formats a 128-bit
-    ID as a character string. It expects the ID and a string array
-    capable of storing 33 characters. The ID will be formatted as 32
-    lowercase hexadecimal digits and be terminated by a
-    <constant>NUL</constant> byte.</para>
+    <para><function>sd_id128_to_string()</function> formats a 128-bit ID as a character string. It expects
+    the ID and a string array capable of storing 33 characters
+    (<constant>SD_ID128_STRING_MAX</constant>). The ID will be formatted as 32 lowercase hexadecimal digits
+    and be terminated by a <constant>NUL</constant> byte.</para>
+
+    <para><function>SD_ID128_TO_STRING()</function> is a macro that wraps
+    <function>sd_id128_to_string()</function> and passes an appropriately sized buffer as second argument,
+    allocated as C99 compound literal. Each use will thus implicitly acquire a suitable buffer on the stack
+    which remains valid until the end of the current code block. This is usually the simplest way to acquire
+    a string representation of a 128-bit ID in a buffer that is valid in the current code block.</para>
 
-    <para><function>sd_id128_from_string()</function> implements the reverse operation: it takes a 33 character string
-    with 32 hexadecimal digits (either lowercase or uppercase, terminated by <constant>NUL</constant>) and parses them
-    back into a 128-bit ID returned in <parameter>ret</parameter>. Alternatively, this call can also parse a
-    37-character string with a 128-bit ID formatted as RFC UUID. If <parameter>ret</parameter> is passed as
-    <constant>NULL</constant> the function will validate the passed ID string, but not actually return it in parsed
-    form.</para>
+    <para><function>sd_id128_from_string()</function> implements the reverse operation: it takes a 33
+    character string with 32 hexadecimal digits (either lowercase or uppercase, terminated by
+    <constant>NUL</constant>) and parses them back into a 128-bit ID returned in
+    <parameter>ret</parameter>. Alternatively, this call can also parse a 37-character string with a 128-bit
+    ID formatted as RFC UUID. If <parameter>ret</parameter> is passed as <constant>NULL</constant> the
+    function will validate the passed ID string, but not actually return it in parsed form.</para>
 
     <para>Note that when parsing 37 character UUIDs this is done strictly in Big Endian byte order,
-    i.e. according to <ulink url="https://tools.ietf.org/html/rfc4122">RFC4122</ulink> Variant 1
-    rules, even if the UUID encodes a different variant. This matches behaviour in various other Linux
-    userspace tools. It's probably wise to avoid UUIDs of other variant types.</para>
-
-    <para>For more information about the <literal>sd_id128_t</literal>
-    type see
-    <citerefentry><refentrytitle>sd-id128</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
-    Note that these calls operate the same way on all architectures,
-    i.e. the results do not depend on endianness.</para>
-
-    <para>When formatting a 128-bit ID into a string, it is often
-    easier to use a format string for
-    <citerefentry project='man-pages'><refentrytitle>printf</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
-    This is easily done using the
-    <constant>SD_ID128_FORMAT_STR</constant> and <function>SD_ID128_FORMAT_VAL()</function> macros. For
-    more information see
+    i.e. according to <ulink url="https://tools.ietf.org/html/rfc4122">RFC4122</ulink> Variant 1 rules, even
+    if the UUID encodes a different variant. This matches behaviour in various other Linux userspace
+    tools. It's probably wise to avoid UUIDs of other variant types.</para>
+
+    <para>For more information about the <literal>sd_id128_t</literal> type see
+    <citerefentry><refentrytitle>sd-id128</refentrytitle><manvolnum>3</manvolnum></citerefentry>.  Note that
+    these calls operate the same way on all architectures, i.e. the results do not depend on
+    endianness.</para>
+
+    <para>When formatting a 128-bit ID into a string, it is often easier to use a format string for
+    <citerefentry
+    project='man-pages'><refentrytitle>printf</refentrytitle><manvolnum>3</manvolnum></citerefentry>.  This
+    is easily done using the <constant>SD_ID128_FORMAT_STR</constant> and
+    <function>SD_ID128_FORMAT_VAL()</function> macros. For more information see
     <citerefentry><refentrytitle>sd-id128</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>
   </refsect1>
 
   <refsect1>
     <title>Return Value</title>
 
-    <para><function>sd_id128_to_string()</function> always succeeds
-    and returns a pointer to the string array passed in.
-    <function>sd_id128_from_string()</function> returns 0 on success, in
-    which case <parameter>ret</parameter> is filled in, or a negative
-    errno-style error code.</para>
+    <para><function>sd_id128_to_string()</function> always succeeds and returns a pointer to the string array
+    passed in.  <function>sd_id128_from_string()</function> returns 0 on success, in which case
+    <parameter>ret</parameter> is filled in, or a negative errno-style error code.</para>
   </refsect1>
 
   <xi:include href="libsystemd-pkgconfig.xml" />
index 053ef0a6a83f091a9aeddfa32b601d0e53dde0dd..b7327a1f0700794e7c33046ec62916ff5b20d687 100644 (file)
@@ -12,6 +12,8 @@
 
 char *id128_to_uuid_string(sd_id128_t id, char s[static ID128_UUID_STRING_MAX]);
 
+#define ID128_TO_UUID_STRING(id) id128_to_uuid_string((id), (char[ID128_UUID_STRING_MAX]) {})
+
 bool id128_is_valid(const char *s) _pure_;
 
 typedef enum Id128Format {
index f2dd7357f863dcfa9085e4b057d208f99f6238f9..e64f3200a3b56dab29311d01ee8e7208be1e84ab 100644 (file)
@@ -34,11 +34,13 @@ union sd_id128 {
         uint64_t qwords[2];
 };
 
-#define SD_ID128_STRING_MAX 33
+#define SD_ID128_STRING_MAX 33U
 
 char *sd_id128_to_string(sd_id128_t id, char s[_SD_ARRAY_STATIC SD_ID128_STRING_MAX]);
 int sd_id128_from_string(const char *s, sd_id128_t *ret);
 
+#define SD_ID128_TO_STRING(id) sd_id128_to_string((id), (char[SD_ID128_STRING_MAX]) {})
+
 int sd_id128_randomize(sd_id128_t *ret);
 
 int sd_id128_get_machine(sd_id128_t *ret);