OSDN Git Service

Mochi Library追加(連結リスト)
authorMochi <master.c.mochi@gmail.com>
Sun, 5 Feb 2017 13:02:28 +0000 (22:02 +0900)
committerMochi <master.c.mochi@gmail.com>
Sun, 5 Feb 2017 13:02:28 +0000 (22:02 +0900)
src/include/MLib/Basic/MLibBasicList.h [new file with mode: 0644]
src/include/MLib/MLib.h [new file with mode: 0644]
src/libraries/Makefile
src/libraries/libMLibBasic/List/ListInit.c [new file with mode: 0644]
src/libraries/libMLibBasic/List/ListInsert.c [new file with mode: 0644]
src/libraries/libMLibBasic/List/ListRemove.c [new file with mode: 0644]
src/libraries/libMLibBasic/Makefile [new file with mode: 0644]

diff --git a/src/include/MLib/Basic/MLibBasicList.h b/src/include/MLib/Basic/MLibBasicList.h
new file mode 100644 (file)
index 0000000..e5ec5b7
--- /dev/null
@@ -0,0 +1,69 @@
+/******************************************************************************/
+/* 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
diff --git a/src/include/MLib/MLib.h b/src/include/MLib/MLib.h
new file mode 100644 (file)
index 0000000..609a8f7
--- /dev/null
@@ -0,0 +1,26 @@
+/******************************************************************************/
+/* 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
index fa02261..24ac4e9 100644 (file)
@@ -1,13 +1,14 @@
 #******************************************************************************#
 #* 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
 
 
 #******************************************************************************#
diff --git a/src/libraries/libMLibBasic/List/ListInit.c b/src/libraries/libMLibBasic/List/ListInit.c
new file mode 100644 (file)
index 0000000..863b26b
--- /dev/null
@@ -0,0 +1,46 @@
+/******************************************************************************/
+/* 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;
+}
+
+
+/******************************************************************************/
diff --git a/src/libraries/libMLibBasic/List/ListInsert.c b/src/libraries/libMLibBasic/List/ListInsert.c
new file mode 100644 (file)
index 0000000..c8685d0
--- /dev/null
@@ -0,0 +1,325 @@
+/******************************************************************************/
+/* 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;
+}
+
+
+/******************************************************************************/
diff --git a/src/libraries/libMLibBasic/List/ListRemove.c b/src/libraries/libMLibBasic/List/ListRemove.c
new file mode 100644 (file)
index 0000000..51bea98
--- /dev/null
@@ -0,0 +1,252 @@
+/******************************************************************************/
+/* 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;
+}
+
+
+/******************************************************************************/
diff --git a/src/libraries/libMLibBasic/Makefile b/src/libraries/libMLibBasic/Makefile
new file mode 100644 (file)
index 0000000..9a2a5f6
--- /dev/null
@@ -0,0 +1,78 @@
+#******************************************************************************#
+#* 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 $<
+
+
+#******************************************************************************#