Что у меня сейчас есть: В отдельном файле .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], и так далее?
size_t = bufsize = 0;
?? может быть size_t bufsize = 0;
?
Есть только одинlinelen = getline(&line, &bufsize, makefile);
, и это нет внутри цикла.
Убедитесь, что вы скопировали имена в структуры
tgt
, так что, когда ваш следующий ввод перезаписывает предыдущий ввод, он не перезаписывает сохраненные данные. Вероятно, это означает динамическое выделение и копирование памяти (или использованиеstrdup()
), а не просто сохранение указателей.