Node *last = NULL;
assert(array != NULL && length > 0);
for(i = length - 1; i >= 0; i--)
{
Node *node = (Node*)malloc(sizeof(Node));
node->ptr = array[i];
node->next = last;
last = node;
}
return last;
}
void foreach(Node *list, void (*process) (Node *))
{
Node *current = NULL;
assert(list != NULL && process != NULL);
for(current = list; current != NULL; current = current->next)
{
process(current);
}
}
testNode.c
#include <stdio.h>
#include "node.h"
#include "gtest/gtest.h"
void printNode(Node *node)
{
static int i = 0;
int data[] = {1,2,3};
EXPECT_EQ(data[i], *(int*)node->ptr);
i++;
}
TEST(NODE,makeListWithArray){
int i;
int data[] = {1,2,3};
void *aSet[] = {&data[0], &data , &data };
Node *list = makeListWithArray(aSet, 3);
foreach(list, printNode);
}
程序入口实现(main.c)
#include <stdio.h>
#include <string.h>
#include "message.h"
#include "node.h"
# define FALSE 0
# define TRUE 1
typedef int BOOL;
typedef BOOL (*FuncIsAllowSend)(Message *, Node*);
BOOL isAllowSendCheckDate(Message *message, Node *node)
{
FuncIsAllowSend isAllowSend = NULL;
if(strcmp(message->date, "20130101") == 0)
{
return FALSE;
}
isAllowSend = (FuncIsAllowSend) node->next->ptr;
return isAllowSend(message, node->next);
}
BOOL isAllowSendCheckWhiteList(Message *message, Node *node)
{
FuncIsAllowSend isAllowSend = NULL;
if(message->sender == 10)
{
return TRUE;
}
isAllowSend = (FuncIsAllowSend) node->next->ptr;
return isAllowSend(message, node->next);
}
BOOL isAllowSendWithDefault(Message *message, Node *node)
{
setChargeFlag(message);
return TRUE;
}
int main()
{
Message *message = makeMessage(1,"20131212");
void *actionList[] = {(void*)&isAllowSendCheckDate,
(void*)&isAllowSendCheckWhiteList,
(void*)&isAllowSendWithDefault};
Node *theList = makeListWithArray(actionList, sizeof(actionList)/4);
FuncIsAllowSend isAllowSend = (FuncIsAllowSend)theList->ptr;
if(isAllowSend(message, theList) == TRUE)
{
setSendFlag(message);
}
printf("%s\n",format(message));
}
代码风格其实是C风格,但是因为要使用gtest不得不使用了g++对程序进行编译调试,命令如下:
# 前提:我已经把gtest编译成库放在了系统目录下
g++ -c message.c
g++ -c testMessage.c
g++ message.o testMessage.o -lgtest -lpthread
./a.out
g++ -c node.c
g++ -c testNode.c
g++ node.o testNode.o -lgtest -lpthread
./a.out
g++ -c main.c
g++ message.o node.o main.o
./a.out