*/
char *strdup_chk(const char *s, char *tag);
+/**
+ * @brief malloc_chkを実行してメモリを確保し、コピーした文字列の指定した長さの部分を返す
+ *
+ * @return コピーした文字列
+ *
+ * @param s 文字列
+ * @param len 文字列の長さ
+ * @param tag エラーメッセージなどで表示されるタグ
+ */
+char *strndup_chk(const char *s, size_t len, char *tag);
#endif
strcpy(t, s);
return t;
}
+
+char *strndup_chk(const char *s, size_t len, char *tag)
+{
+ assert(s != NULL);
+ char *t;
+
+ t = malloc_chk(len + 1, tag);
+ strncpy(t, s, len);
+ t[len] = '\0';
+ return t;
+}
--- /dev/null
+abcdefghij
--- /dev/null
+include ../Define.mk
+include ../Test.mk
+
+CC := gcc
+CFLAGS := -Wall
+
+.INTERMEDIATE: $(CMD_FILE)
+
+CMDSRC_FILE := cmd.c
+TARGETDIR := ../../../src
+INCLUDEDIR := ../../../include
+TESTTARGET_FILES := $(TARGETDIR)/cmem.c # Set test target files
+
+$(CMD_FILE): $(CMDSRC_FILE) $(TESTTARGET_FILES)
+ $(CC) $(CFLAGS) -I $(INCLUDEDIR) -o $@ $^
+
+clean_cmd:
+ @rm -rf cmd.dSYM cmd
+
+clean: clean_cmd
--- /dev/null
+#include <stdio.h>
+#include "cmem.h"
+
+int main(){
+ char *dst, *src = "abcdefghijklmnopqrstuvwxyz";
+ size_t len = 10;
+
+ dst = strndup_chk(src, len, "strndup_chk unit test");
+ printf("%s\n", dst);
+ FREE(dst);
+ return 0;
+}