--- /dev/null
+/******************************************************************************/
+/* src/include/MLib/Basic/MLibBasicList.h */
+/* 2017/02/05 */
+/* Copyright (C) 2017 Mochi */
+/******************************************************************************/
+#ifndef _MLIB_BASIC_LIST_H_
+#define _MLIB_BASIC_LIST_H_
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+#include <stddef.h>
+
+#include <MLib/MLib.h>
+
+
+/******************************************************************************/
+/* 定義 */
+/******************************************************************************/
+/** ノード構造体 */
+typedef struct MLibBasicListNode {
+ struct MLibBasicListNode *pNext; /**< 前ノード */
+ struct MLibBasicListNode *pPrev; /**< 次ノード */
+} MLibBasicListNode_t;
+
+/** 連結リスト構造体 */
+typedef struct {
+ MLibBasicListNode_t *pHead; /**< 先頭ノード */
+ MLibBasicListNode_t *pTail; /**< 最後尾ノード */
+ size_t size; /**< 連結リストのノード個数 */
+} MLibBasicList_t;
+
+
+/******************************************************************************/
+/* グローバル関数プロトタイプ宣言 */
+/******************************************************************************/
+/* 連結リスト初期化 */
+extern MLibRet_t MLibBasicListInit( MLibBasicList_t *pList );
+
+/* ノード後挿入 */
+extern MLibRet_t MLibBasicListInsertAfter( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode,
+ MLibBasicListNode_t *pNewNode );
+
+/* ノード前挿入 */
+extern MLibRet_t MLibBasicListInsertBefore( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode,
+ MLibBasicListNode_t *pNewNode );
+
+/* ノード先頭挿入 */
+extern MLibRet_t MLibBasicListInsertHead( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNewNode );
+
+/* ノード最後尾挿入 */
+extern MLibRet_t MLibBasicListInsertTail( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNewNode );
+
+/* 指定ノード削除 */
+extern MLibRet_t MLibBasicListRemove( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode );
+
+/* 先頭ノード削除 */
+extern MLibBasicListNode_t *MLibBasicListRemoveHead( MLibBasicList_t *pList );
+
+/* 最後尾ノード削除 */
+extern MLibBasicListNode_t *MLibBasicListRemoveTail( MLibBasicList_t *pList );
+
+
+/******************************************************************************/
+#endif
--- /dev/null
+/******************************************************************************/
+/* src/include/MLib/MLib.h */
+/* 2017/02/05 */
+/* Copyright (C) 2017 Mochi */
+/******************************************************************************/
+#ifndef _MLIB_H_
+#define _MLIB_H_
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+#include <stdint.h>
+
+
+/******************************************************************************/
+/* 定義 */
+/******************************************************************************/
+/* 関数戻り値定義 */
+#define MLIB_SUCCESS ( 0 ) /** 正常終了 */
+#define MLIB_FAILURE ( -1 ) /** 異常終了 */
+
+/** 関数戻り値型 */
+typedef int32_t MLibRet_t;
+
+
+/******************************************************************************/
+#endif
#******************************************************************************#
#* src/libraries/Makefile *#
-#* 2016/12/13 *#
-#* Copyright (C) 2016 Mochi. *#
+#* 2017/02/04 *#
+#* Copyright (C) 2016-2017 Mochi. *#
#******************************************************************************#
#******************************************************************************#
#* マクロ設定 *#
#******************************************************************************#
# サブディレクトリ
-SUB_DIRS = libc
+SUB_DIRS = libc \
+ libMLibBasic
#******************************************************************************#
--- /dev/null
+/******************************************************************************/
+/* src/libraries/libMLibBasic/List/ListInit.c */
+/* 2017/02/05 */
+/* Copyright (C) 2017 Mochi. */
+/******************************************************************************/
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+#include <stddef.h>
+#include <MLib/MLib.h>
+#include <MLib/Basic/MLibBasicList.h>
+
+
+/******************************************************************************/
+/* グローバル関数宣言 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief 連結リスト初期化
+ * @details 連結リスト構造体の初期化を行う。
+ *
+ * @param[in] *pList 連結リスト
+ *
+ * @retval MLIB_SUCCESS 正常終了
+ * @retval MLIB_FAILURE 異常終了
+ */
+/******************************************************************************/
+MLibRet_t MLibBasicListInit( MLibBasicList_t *pList )
+{
+ /* 引数チェック */
+ if ( pList == NULL ) {
+ /* NULL */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 連結リスト初期化 */
+ pList->pHead = NULL;
+ pList->pTail = NULL;
+ pList->size = 0;
+
+ return MLIB_SUCCESS;
+}
+
+
+/******************************************************************************/
--- /dev/null
+/******************************************************************************/
+/* src/libraries/libMLibBasic/List/ListInsert.c */
+/* 2017/02/05 */
+/* Copyright (C) 2017 Mochi. */
+/******************************************************************************/
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+#include <stddef.h>
+#include <stdint.h>
+
+#include <MLib/MLib.h>
+#include <MLib/Basic/MLibBasicList.h>
+
+
+/******************************************************************************/
+/* グローバル関数宣言 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief ノード後挿入
+ * @details 指定したノードの後ろに新しいノードを挿入する。
+ *
+ * @param[in] *pList 連結リスト
+ * @param[in] *pNode 挿入先ノード
+ * @param[in] *pNewNode 挿入ノード
+ *
+ * @retval MLIB_SUCCESS 正常終了
+ * @retval MLIB_FAILURE 異常終了
+ */
+/******************************************************************************/
+MLibRet_t MLibBasicListInsertAfter( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode,
+ MLibBasicListNode_t *pNewNode )
+{
+ MLibBasicListNode_t *pNextNode; /* 挿入後ノード */
+
+ /* 初期化 */
+ pNextNode = NULL;
+
+ /* 引数pListチェック */
+ if ( pList == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 引数pNodeチェック */
+ if ( pNode == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 引数pNewNodeチェック */
+ if ( pNewNode == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 連結リストサイズチェック */
+ if ( ( pList->size == 0 ) || ( pList->size == SIZE_MAX ) ) {
+ /* サイズ不正 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 挿入後ノード取得 */
+ pNextNode = pNode->pNext;
+
+ /* 挿入前ノード設定 */
+ pNode->pNext = pNewNode;
+
+ /* 挿入ノード設定 */
+ pNewNode->pPrev = pNode;
+ pNewNode->pNext = pNextNode;
+
+ /* 挿入後ノード有無判定 */
+ if ( pNextNode == NULL ) {
+ /* 挿入後ノード無 */
+
+ /* 連結リスト最後尾ノード設定 */
+ pList->pTail = pNewNode;
+
+ } else {
+ /* 挿入後ノード有 */
+
+ /* 挿入後ノード設定 */
+ pNextNode->pPrev = pNextNode;
+ }
+
+ /* 連結リストサイズ設定 */
+ pList->size++;
+
+ return MLIB_SUCCESS;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief ノード前挿入
+ * @details 指定したノードの前に新しいノードを挿入する。
+ *
+ * @param[in] *pList 連結リスト
+ * @param[in] *pNode 挿入先ノード
+ * @param[in] *pNewNode 挿入ノード
+ *
+ * @retval MLIB_SUCCESS 正常終了
+ * @retval MLIB_FAILURE 異常終了
+ */
+/******************************************************************************/
+MLibRet_t MLibBasicListInsertBefore( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode,
+ MLibBasicListNode_t *pNewNode )
+{
+ MLibBasicListNode_t *pBeforeNode; /* 挿入前ノード */
+
+ /* 初期化 */
+ pBeforeNode = NULL;
+
+ /* 引数pListチェック */
+ if ( pList == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 引数pNodeチェック */
+ if ( pNode == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 引数pNewNodeチェック */
+ if ( pNewNode == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 連結リストサイズチェック */
+ if ( ( pList->size == 0 ) || ( pList->size == SIZE_MAX ) ) {
+ /* サイズ不正 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 挿入前ノード取得 */
+ pBeforeNode = pNode->pPrev;
+
+ /* 挿入後ノード設定 */
+ pNode->pPrev = pNewNode;
+
+ /* 挿入ノード設定 */
+ pNewNode->pNext = pNode;
+ pNewNode->pPrev = pBeforeNode;
+
+ /* 挿入前ノード有無判定 */
+ if ( pBeforeNode == NULL ) {
+ /* 挿入前ノード無 */
+
+ /* 連結リスト先頭ノード設定 */
+ pList->pHead = pNewNode;
+
+ } else {
+ /* 挿入前ノード有 */
+
+ /* 挿入前ノード設定 */
+ pBeforeNode->pNext = pNewNode;
+ }
+
+ /* 連結リストサイズ設定 */
+ pList->size++;
+
+ return MLIB_SUCCESS;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief ノード先頭挿入
+ * @details 指定した連結リストの先頭に新しいノードを挿入する。
+ *
+ * @param[in] *pList 連結リスト
+ * @param[in] *pNewNode 挿入ノード
+ *
+ * @retval MLIB_SUCCESS 正常終了
+ * @retval MLIB_FAILURE 異常終了
+ */
+/******************************************************************************/
+MLibRet_t MLibBasicListInsertHead( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNewNode )
+{
+ MLibBasicListNode_t *pOldHead; /* 旧先頭ノード */
+
+ /* 初期化 */
+ pOldHead = NULL;
+
+ /* 引数pListチェック */
+ if ( pList == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 引数pNewNodeチェック */
+ if ( pNewNode == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 連結リストサイズチェック */
+ if ( pList->size == SIZE_MAX ) {
+ /* サイズ不正 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 旧先頭ノード取得 */
+ pOldHead = pList->pHead;
+
+ /* 連結リスト先頭ノード設定 */
+ pList->pHead = pNewNode;
+
+ /* 挿入ノード設定 */
+ pNewNode->pNext = pOldHead;
+ pNewNode->pPrev = NULL;
+
+ /* 旧先頭ノード有無判定 */
+ if ( pOldHead == NULL ) {
+ /* 旧先頭ノード無 */
+
+ /* 連結リスト最後尾ノード設定 */
+ pList->pTail = pNewNode;
+
+ } else {
+ /* 旧先頭ノード有 */
+
+ /* 旧先頭ノード設定 */
+ pOldHead->pPrev = pNewNode;
+ }
+
+ /* 連結リストサイズ設定 */
+ pList->size++;
+
+ return MLIB_SUCCESS;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief ノード最後尾挿入
+ * @details 指定した連結リストの最後尾に新しいノードを挿入する。
+ *
+ * @param[in] *pList 連結リスト
+ * @param[in] *pNewNode 挿入ノード
+ *
+ * @retval MLIB_SUCCESS 正常終了
+ * @retval MLIB_FAILURE 異常終了
+ */
+/******************************************************************************/
+MLibRet_t MLibBasicListInsertTail( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNewNode )
+{
+ MLibBasicListNode_t *pOldTail; /* 最後尾ノード */
+
+ /* 初期化 */
+ pOldTail = NULL;
+
+ /* 引数pListチェック */
+ if ( pList == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 引数pNewNodeチェック */
+ if ( pNewNode == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 連結リストサイズチェック */
+ if ( pList->size == SIZE_MAX ) {
+ /* サイズ不正 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 旧最後尾ノード取得 */
+ pOldTail = pList->pTail;
+
+ /* 連結リスト最後尾ノード設定 */
+ pList->pTail = pNewNode;
+
+ /* 挿入ノード設定 */
+ pNewNode->pNext = NULL;
+ pNewNode->pPrev = pOldTail;
+
+ /* 旧最後尾ノード有無判定 */
+ if ( pOldTail == NULL ) {
+ /* 旧最後尾ノード無 */
+
+ /* 連結リスト先頭ノード設定 */
+ pList->pHead = pNewNode;
+
+ } else {
+ /* 旧最後尾ノード有 */
+
+ /* 旧最後尾ノード設定 */
+ pOldTail->pNext = pNewNode;
+ }
+
+ /* 連結リストサイズ設定 */
+ pList->size++;
+
+ return MLIB_SUCCESS;
+}
+
+
+/******************************************************************************/
--- /dev/null
+/******************************************************************************/
+/* src/libraries/libMLibBasic/List/ListRemove.c */
+/* 2017/02/05 */
+/* Copyright (C) 2017 Mochi. */
+/******************************************************************************/
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+#include <stddef.h>
+#include <MLib/MLib.h>
+#include <MLib/Basic/MLibBasicList.h>
+
+
+/******************************************************************************/
+/* グローバル関数宣言 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief 指定ノード削除
+ * @details 連結リストから指定したノードを削除する。
+ *
+ * @param[in] *pList 連結リスト
+ * @param[in] *pNode ノード
+ *
+ * @retval MLIB_SUCCESS 正常終了
+ * @retval MLIB_FAILURE 異常終了
+ */
+/******************************************************************************/
+MLibRet_t MLibBasicListRemove( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode )
+{
+ /* 引数pListチェック */
+ if ( pList == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 引数pNodeチェック */
+ if ( pNode == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* 連結リストサイズチェック */
+ if ( pList->size == 0 ) {
+ /* サイズ不正 */
+
+ return MLIB_FAILURE;
+ }
+
+ /* ノード位置判定 */
+ if ( ( pNode->pPrev == NULL ) && ( pNode->pNext == NULL ) ) {
+ /* 先頭かつ最後尾ノード */
+
+ /* 連結リスト先頭・最後尾ノード設定 */
+ pList->pHead = NULL;
+ pList->pTail = NULL;
+
+ } else if ( pNode->pPrev == NULL ) {
+ /* 先頭ノード */
+
+ /* 連結リスト先頭ノード設定 */
+ pList->pHead = pNode->pNext;
+
+ /* 後ノード設定 */
+ pList->pHead->pPrev = NULL;
+
+ } else if ( pNode->pNext == NULL ) {
+ /* 最後尾ノード */
+
+ /* 連結リスト最後尾ノード設定 */
+ pList->pTail = pNode->pPrev;
+
+ /* 前ノード設定 */
+ pList->pTail->pNext = NULL;
+
+ } else {
+ /* 中間ノード */
+
+ /* 前後ノード設定 */
+ pNode->pNext->pPrev = pNode->pPrev;
+ pNode->pPrev->pNext = pNode->pNext;
+ }
+
+ /* 削除ノード設定 */
+ pNode->pNext = NULL;
+ pNode->pPrev = NULL;
+
+ /* 連結リストサイズ設定 */
+ pList->size--;
+
+ return MLIB_SUCCESS;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief 先頭ノード削除
+ * @details 連結リストの先頭ノードを削除する。
+ *
+ * @param[in] *pList 連結リスト
+ *
+ * @retval NULL 正常終了(先頭ノード)
+ * @retval NULL以外 異常終了
+ */
+/******************************************************************************/
+MLibBasicListNode_t *MLibBasicListRemoveHead( MLibBasicList_t *pList )
+{
+ MLibBasicListNode_t *pNode; /* 先頭ノード(戻り値) */
+
+ /* 初期化 */
+ pNode = NULL;
+
+ /* 引数pListチェック */
+ if ( pList == NULL ) {
+ /* 不正値 */
+
+ return NULL;
+ }
+
+ /* 引数pNodeチェック */
+ if ( pNode == NULL ) {
+ /* 不正値 */
+
+ return NULL;
+ }
+
+ /* 連結リストサイズチェック */
+ if ( pList->size == 0 ) {
+ /* サイズ不正 */
+
+ return NULL;
+ }
+
+ /* 先頭ノード有無判定 */
+ if ( pList->pHead == NULL ) {
+ /* 先頭ノード無 */
+
+ return NULL;
+ }
+
+ /* 先頭ノード取得 */
+ pNode = pList->pHead;
+
+ /* 連結リスト先頭ノード設定 */
+ pList->pHead = pNode->pNext;
+
+ /* 次ノード有無判定 */
+ if ( pNode->pNext == NULL ) {
+ /* 次ノード無 */
+
+ /* 連結リスト最後尾ノード設定 */
+ pList->pTail = NULL;
+
+ } else {
+ /* 次ノード有 */
+
+ /* 次ノード設定 */
+ pNode->pNext->pPrev = NULL;
+ }
+
+ /* 連結リストサイズ設定 */
+ pList->size--;
+
+ /* 先頭ノード設定 */
+ pNode->pNext = NULL;
+ pNode->pPrev = NULL;
+
+ return pNode;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief 最後尾ノード削除
+ * @details 連結リストの先頭ノードを削除する。
+ *
+ * @param[in] *pList 連結リスト
+ *
+ * @retval NULL 正常終了(先頭ノード)
+ * @retval NULL以外 異常終了
+ */
+/******************************************************************************/
+MLibBasicListNode_t *MLibBasicListRemoveTail( MLibBasicList_t *pList )
+{
+ MLibBasicListNode_t *pNode; /* 先頭ノード(戻り値) */
+
+ /* 初期化 */
+ pNode = NULL;
+
+ /* 引数pListチェック */
+ if ( pList == NULL ) {
+ /* 不正値 */
+
+ return NULL;
+ }
+
+ /* 引数pNodeチェック */
+ if ( pNode == NULL ) {
+ /* 不正値 */
+
+ return NULL;
+ }
+
+ /* 連結リストサイズチェック */
+ if ( pList->size == 0 ) {
+ /* サイズ不正 */
+
+ return NULL;
+ }
+
+ /* 最後尾ノード有無判定 */
+ if ( pList->pTail == NULL ) {
+ /* 最後尾ノード無 */
+
+ return NULL;
+ }
+
+ /* 最後尾ノード取得 */
+ pNode = pList->pTail;
+
+ /* 連結リスト最後尾ノード設定 */
+ pList->pTail = pNode->pPrev;
+
+ /* 前ノード有無判定 */
+ if ( pNode->pPrev == NULL ) {
+ /* 前ノード無 */
+
+ /* 連結リスト先頭ノード設定 */
+ pList->pHead = NULL;
+
+ } else {
+ /* 前ノード有 */
+
+ /* 前ノード設定 */
+ pNode->pPrev->pNext = NULL;
+ }
+
+ /* 連結リストサイズ設定 */
+ pList->size--;
+
+ /* 最後尾ノード設定 */
+ pNode->pNext = NULL;
+ pNode->pPrev = NULL;
+
+ return pNode;
+}
+
+
+/******************************************************************************/
--- /dev/null
+#******************************************************************************#
+#* src/libraries/libMLibBasic/Makefile *#
+#* 2017/02/05 *#
+#* Copyright (C) 2017 Mochi. *#
+#******************************************************************************#
+#******************************************************************************#
+#* マクロ設定 *#
+#******************************************************************************#
+# ベースディレクトリsrc/からの相対パス
+CUR_DIR = libraries/libMLibBasic
+
+# バイナリ名
+LIB_NAME = libMLibBasic.a
+
+# ソースコード
+SRCS = List/ListInit.c \
+ List/ListInsert.c \
+ List/ListRemove.c
+
+# Cフラグ
+CFLAGS = -O \
+ -Wall \
+ -masm=intel \
+ -m32 \
+ -ffreestanding \
+ -I../../include/
+
+
+#******************************************************************************#
+#* 自動設定マクロ *#
+#******************************************************************************#
+# ベースディレクトリパス
+BASE_DIR = $(shell pwd | sed -e 's/\/src\/$(subst /,\/,$(CUR_DIR))//')
+# 中間ファイル格納先ディレクトリパス
+OBJS_DIR = $(BASE_DIR)/build/objs/$(CUR_DIR)
+# ディレクトリリスト
+DIR_LIST = $(sort $(addprefix $(OBJS_DIR)/, $(dir $(SRCS))))
+
+# オブジェクトファイル
+OBJS = $(addprefix $(OBJS_DIR)/, $(SRCS:.c=.o))
+
+
+#******************************************************************************#
+#* phonyターゲット *#
+#******************************************************************************#
+# サブディレクトリも含めたコンパイル
+.PHONY: all
+all: $(DIR_LIST) $(OBJS_DIR)/$(LIB_NAME) Makefile
+
+# 全生成ファイルの削除
+.PHONY: clean
+clean:
+ -rm -rf $(OBJS_DIR)/../$(LIB_NAME) $(OBJS_DIR)
+
+
+#******************************************************************************#
+#* 生成規則 *#
+#******************************************************************************#
+ifdef DIR_LIST
+$(DIR_LIST):
+ mkdir -p $@
+endif
+
+# バイナリ
+$(OBJS_DIR)/$(LIB_NAME): $(OBJS) Makefile
+ $(AR) rcs $@ $(OBJS)
+ ln -f -s $@ $(OBJS_DIR)/../$(LIB_NAME)
+
+# アセンブラファイルコンパイル
+$(OBJS_DIR)/%.o: %.s Makefile
+ $(AS) -o $@ $<
+
+# Cファイルコンパイル
+$(OBJS_DIR)/%.o: %.c Makefile
+ $(CC) $(CFLAGS) -o $@ -c $<
+
+
+#******************************************************************************#