Хранение различных полей данных и связывание их в C - PullRequest
0 голосов
/ 31 октября 2018

Что у меня сейчас есть: В отдельном файле .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] и так далее?

...