我目前所拥有的: 在一个单独的名为main.c的.c文件中,我有一个主要函数,如下所示:
int main(int argc, const char** argv){
FILE* makefile = fopen("./testfile","r");
size_t bufsize = 0;
char* line = NULL;
ssize_t linelen = getline(&line, &bufsize, makefile);
while (linelen != -1){
if(line[linelen-1] == '\n'){
linelen -=1;
line[linelen] = '\0';
}
if(line[0] != '\t'){
storetgt(&line[0]);
} else if (line[0] == '\t') {
storerules(&line[0]);
}
}
}
此处,名为“ testfile”的文本文件如下所示:
A:
echo A
B:
echo B
c:
echo C
,它将逐行进行解析,将测试文件的数据存储在第4行中。如果该行的第一个元素不是制表符,则main()将调用一个名为storetgt的函数,如果该行的第一个元素是制表符,则main()将调用一个名为storerules的函数(两者.c文件名为tgt.c,其中包含收集tgt名称和规则的框架。 我遇到的麻烦是tgt.c中的存储部分和链接部分;我的代码如下:
typedef struct tgt_st {
char* name;
string_list rules;
struct tgt_st *next;
}tgt;
typedef struct string_list {
char* rules;
struct string_list* next;
}string_list;
tgt* createtgt(char* name, string_list rules, tgt* next){
tgt* new_node = (tgt*)malloc(sizeof(tgt));
new_node -> name = name;
new_node -> rules = rules;
new_node -> next = next;
return new_node;
}
tgt* createrules(string_list rules, tgt* next){
tgt* new_node = (tgt*)malloc(sizeof(target));
new_node -> rules = rules;
new_node -> next = next;
return new_node;
}
void storetgt(char* line){
int argcp = 0;
char** args = arg_parse(line,&argcp);
if(strcmp(args[0], "a:") == 0){
create(args[0],NULL,NULL);
}else if(strcmp(args[0], "b:") == 0){
create(args[0],NULL,NULL);
}else if(strcmp(args[0], "c:") == 0){
create(args[0],NULL,NULL);
}
}
void storerules(char* line){
int argcp;
char** args = arg_parse(line,&argcp);
if(line[0] == '\t'){
storerules(&line[1]);
} else {
if(strcmp(args[0], "echo") == 0 && strcmp(args[1], "a") == 0){
createrules(args, NULL);
}else if(strcmp[0], "echo") == 0 && strcmp(args[1], "b") == 0){
createrules(args, NULL);
}else if(strcmp[0], "echo") == 0 && strcmp(args[1], "c") == 0){
createrules(args, NULL);
}
}
}//ags is pointer to array of characters that holds arguments.
这似乎是在创建一堆包含不同tgt名称的分离节点,以及另一堆包含不同规则的分离节点。如何使持有[A:]的tgt节点指向包含[echo A]的节点,让持有[B:]的tgt节点指向包含[echo B]的节点,依此类推?