+
+/* SilcStack aware routines */
+
+void *silc_smalloc(SilcStack stack, SilcUInt32 size)
+{
+ return stack ? silc_stack_malloc(stack, size, TRUE) : silc_malloc(size);
+}
+
+void *silc_smalloc_ua(SilcStack stack, SilcUInt32 size)
+{
+ return stack ? silc_stack_malloc(stack, size, FALSE) : silc_malloc(size);
+}
+
+void *silc_scalloc(SilcStack stack, SilcUInt32 items, SilcUInt32 size)
+{
+ unsigned char *addr;
+
+ if (!stack)
+ return silc_calloc(items, size);
+
+ addr = silc_stack_malloc(stack, items * size, TRUE);
+ if (!addr)
+ return NULL;
+ memset(addr, 0, items * size);
+ return (void *)addr;
+}
+
+void *silc_srealloc(SilcStack stack, SilcUInt32 old_size,
+ void *ptr, SilcUInt32 size)
+{
+ return stack ? silc_stack_realloc(stack, old_size, ptr, size, TRUE) :
+ silc_realloc(ptr, size);
+}
+
+void *silc_srealloc_ua(SilcStack stack, SilcUInt32 old_size,
+ void *ptr, SilcUInt32 size)
+{
+ return stack ? silc_stack_realloc(stack, old_size, ptr, size, FALSE) :
+ silc_realloc(ptr, size);
+}
+
+void *silc_smemdup(SilcStack stack, const void *ptr, SilcUInt32 size)
+{
+ unsigned char *addr;
+
+ if (!stack)
+ return silc_memdup(ptr, size);
+
+ addr = silc_stack_malloc(stack, size + 1, TRUE);
+ if (!addr)
+ return NULL;
+ memcpy((void *)addr, ptr, size);
+ addr[size] = '\0';
+ return (void *)addr;
+}
+
+char *silc_sstrdup(SilcStack stack, const char *str)
+{
+ SilcInt32 size = strlen(str);
+ char *addr;
+
+ if (!stack)
+ return silc_memdup(str, size);
+
+ addr = silc_stack_malloc(stack, size + 1, FALSE);
+ if (!addr)
+ return NULL;
+ memcpy((void *)addr, str, size);
+ addr[size] = '\0';
+ return addr;
+}