Что у меня сейчас есть:
В отдельном файле .c с именем main.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, и другую группу отдельных узлов, которые содержат разные правила. Как я могу сделать так, чтобы узел tgt, который содержит [A:], указывал на узел, который содержит [echo A], и чтобы узел tgt, который содержит [B:], указывал на узел, который содержит [echo B] и так далее?