summaryrefslogtreecommitdiffstats
path: root/libtecla/strngmem.h
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@oarcorp.com>2015-05-27 13:47:55 -0700
committerJoel Sherrill <joel.sherrill@oarcorp.com>2015-05-27 13:47:55 -0700
commitbc8510c4ea9da320e263b2eecd11a7b309b0e11e (patch)
treee1e5325f3635848c95c680d8ea92874e37653007 /libtecla/strngmem.h
parent.gitignore: New file (diff)
downloadrtems-addon-packages-bc8510c4ea9da320e263b2eecd11a7b309b0e11e.tar.bz2
Add libtecla 1.6.3
Diffstat (limited to 'libtecla/strngmem.h')
-rw-r--r--libtecla/strngmem.h80
1 files changed, 80 insertions, 0 deletions
diff --git a/libtecla/strngmem.h b/libtecla/strngmem.h
new file mode 100644
index 0000000..2138cfb
--- /dev/null
+++ b/libtecla/strngmem.h
@@ -0,0 +1,80 @@
+#ifndef stringmem_h
+#define stringmem_h
+/*
+ * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2012 by Martin C. Shepherd.
+ *
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ */
+
+typedef struct StringMem StringMem;
+
+/*
+ * Applications that dynamically allocate lots of small strings
+ * run the risk of significantly fragmenting the heap. This module
+ * aims to reduce this risk by allocating large arrays of small fixed
+ * length strings, arranging them as a free-list and allowing
+ * callers to allocate from the list. Strings that are too long
+ * to be allocated from the free-list are allocated from the heap.
+ * Since typical implementations of malloc() eat up a minimum of
+ * 16 bytes per call to malloc() [because of alignment and space
+ * management constraints] it makes sense to set the free-list
+ * string size to 16 bytes. Note that unlike malloc() which typically
+ * keeps 8 bytes per allocation for its own use, our allocator will
+ * return all but one of the 16 bytes for use. One hidden byte of overhead
+ * is reserved for flagging whether the string was allocated directly
+ * from malloc or from the free-list.
+ */
+
+/*
+ * Set the length of each free-list string. The longest string that
+ * will be returned without calling malloc() will be one less than
+ * this number.
+ */
+#define SM_STRLEN 16
+
+/*
+ * Create a string free-list container and the first block of its free-list.
+ */
+StringMem *_new_StringMem(unsigned blocking_factor);
+
+/*
+ * Delete a string free-list.
+ */
+StringMem *_del_StringMem(StringMem *sm, int force);
+
+/*
+ * Allocate an array of 'length' chars.
+ */
+char *_new_StringMemString(StringMem *sm, size_t size);
+
+/*
+ * Free a string that was previously returned by _new_StringMemString().
+ */
+char *_del_StringMemString(StringMem *sm, char *s);
+
+#endif