You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2024/09/16 18:00:52 UTC

(nuttx) branch master updated: libs/libc/obstack: implement ptr and int growing functions

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new b04da1892e libs/libc/obstack: implement ptr and int growing functions
b04da1892e is described below

commit b04da1892e59607600d02666c62d97e1cc92d098
Author: Karel Kočí <ka...@nic.cz>
AuthorDate: Sun Sep 15 23:22:19 2024 +0200

    libs/libc/obstack: implement ptr and int growing functions
    
    The new API is defined by GNU and implemented in other LibCs, such as
    Musl.
    
    This also modifies API of obstack_blank_fast and obstack_1grow_fast.
    These are defined as returning void and thus return value here is
    incompatibility with other implementations.
---
 include/obstack.h                    | 83 +++++++++++++++++++++++++++++++++---
 libs/libc/obstack/lib_obstack_grow.c | 34 +++++++++++++++
 2 files changed, 110 insertions(+), 7 deletions(-)

diff --git a/include/obstack.h b/include/obstack.h
index 2e56c6ff08..86a6f4243f 100644
--- a/include/obstack.h
+++ b/include/obstack.h
@@ -70,6 +70,7 @@
  *   Size of the single chunk.
  *
  ****************************************************************************/
+
 #define obstack_chunk_size(h) ((h)->chunk_size)
 
 /****************************************************************************
@@ -86,6 +87,7 @@
  *   Tentative starting address of the currently growing object.
  *
  ****************************************************************************/
+
 #define obstack_base(h) ((h)->object_base)
 
 /****************************************************************************
@@ -102,6 +104,7 @@
  *   Address just after the end of the currently growing object.
  *
  ****************************************************************************/
+
 #define obstack_next_free(h) ((h)->next_free)
 
 /****************************************************************************
@@ -117,11 +120,9 @@
  *   h: pointer to the handle used to grow the object.
  *   size: number of bytes
  *
- * Returned Value:
- *   The new address just after the end of the currently growing object.
- *
  ****************************************************************************/
-#define obstack_blank_fast(h, size) ((h)->next_free += (size))
+
+#define obstack_blank_fast(h, size) ((void)((h)->next_free += (size)))
 
 /****************************************************************************
  * Name: obstack_1grow_fast
@@ -135,11 +136,51 @@
  *   h: pointer to the handle used to grow the object.
  *   data: byte to be added
  *
- * Returned Value:
- *   Added byte.
+ ****************************************************************************/
+
+#define obstack_1grow_fast(h, data) ((void)(*((h)->next_free++) = (data)))
+
+/****************************************************************************
+ * Name: obstack_ptr_grow_fast
+ *
+ * Description:
+ *   Adds one pointer to the currently growing object.
+ *   There is no check if there is enough room and thus it is easy to cause
+ *   buffer overrun. Use only when you are sure that there is enough room!
+ *
+ * Input Parameters:
+ *   h: pointer to the handle used to grow the object.
+ *   ptr: pointer to be added
  *
  ****************************************************************************/
-#define obstack_1grow_fast(h, data) (*((h)->next_free++) = (data))
+
+#define obstack_ptr_grow_fast(h, ptr) \
+  do { \
+   FAR struct obstack *__o = (h); \
+   *(const void **)__o->next_free = (ptr); \
+   __o->next_free += sizeof(const void*); \
+  } while (0)
+
+/****************************************************************************
+ * Name: obstack_int_grow_fast
+ *
+ * Description:
+ *   Adds one integer to the currently growing object.
+ *   There is no check if there is enough room and thus it is easy to cause
+ *   buffer overrun. Use only when you are sure that there is enough room!
+ *
+ * Input Parameters:
+ *   h: pointer to the handle used to grow the object.
+ *   data: integer to be added
+ *
+ ****************************************************************************/
+
+#define obstack_int_grow_fast(h, data) \
+  do { \
+   FAR struct obstack *__o = (h); \
+   *(int*)__o->next_free = (data); \
+   __o->next_free += sizeof(const void*); \
+  } while (0)
 
 /****************************************************************************
  * Public Type Definitions
@@ -340,6 +381,34 @@ void obstack_grow0(FAR struct obstack *h,
 
 void obstack_1grow(FAR struct obstack *h, char data);
 
+/****************************************************************************
+ * Name: obstack_ptr_grow
+ *
+ * Description:
+ *   Grow object by one pointer.
+ *
+ * Input Parameters:
+ *   h: pointer to the handle to allocated object to
+ *   ptr: pointer to be added to the growing object
+ *
+ ****************************************************************************/
+
+void obstack_ptr_grow(FAR struct obstack *h, const void *ptr);
+
+/****************************************************************************
+ * Name: obstack_int_grow
+ *
+ * Description:
+ *   Grow object by one integer.
+ *
+ * Input Parameters:
+ *   h: pointer to the handle to allocated object to
+ *   data: integer to be added to the growing object
+ *
+ ****************************************************************************/
+
+void obstack_int_grow(FAR struct obstack *h, int data);
+
 /****************************************************************************
  * Name: obstack_finish
  *
diff --git a/libs/libc/obstack/lib_obstack_grow.c b/libs/libc/obstack/lib_obstack_grow.c
index 9574d29851..e0ac2cb55c 100644
--- a/libs/libc/obstack/lib_obstack_grow.c
+++ b/libs/libc/obstack/lib_obstack_grow.c
@@ -91,3 +91,37 @@ void obstack_1grow(FAR struct obstack *h, char data)
   obstack_make_room(h, 1);
   obstack_1grow_fast(h, data);
 }
+
+/****************************************************************************
+ * Name: obstack_ptr_grow
+ *
+ * Description:
+ *   Grow object by one pointer.
+ *
+ * Input Parameters:
+ *   h: pointer to the handle to allocated object to
+ *   ptr: pointer to be added to the growing object
+ *
+ ****************************************************************************/
+
+void obstack_ptr_grow(FAR struct obstack *h, const void *ptr)
+{
+  obstack_grow(h, &ptr, sizeof(void *));
+}
+
+/****************************************************************************
+ * Name: obstack_int_grow
+ *
+ * Description:
+ *   Grow object by one integer.
+ *
+ * Input Parameters:
+ *   h: pointer to the handle to allocated object to
+ *   data: integer to be added to the growing object
+ *
+ ****************************************************************************/
+
+void obstack_int_grow(FAR struct obstack *h, int data)
+{
+  obstack_grow(h, &data, sizeof(int));
+}