work
#include<stdio.h>#include<stdlib.h>#include<string.h>#include"pmake.h"Rule*parse_file(FILE*fp){Rule*rules=makeRule();Rule*cur=rules;Action*cur_act=makeAction();Dependency*cur_dep=makeDependency();char*line=malloc(sizeof(char*)*MAXLINE);while(fgets(line,sizeof(MAXLINE),fp)){if(is_comment_or_empty(line)){continue;}char**args=parseLine(line);if(line[0]=='\t'){Action*cur_act=cur->actions;while(cur_act->next_act!=NULL){cur_act=cur_act->next_act;}cur_act->next_act=malloc(sizeof(Action));cur_act->next_act=makeAction();cur_act->next_act->args=args;}else{Rule*cur=rules;while(cur->next_rule!=NULL){cur=cur->next_rule;}for(inti=0;i<sizeof(args);i++){Rule*searchRule=rules;cur_dep=cur->dependencies;while(searchRule->next_rule!=NULL){if(strcmp(searchRule->target,args[i])==0){if(i==0){cur=searchRule;break;}elseif(i>=2){while(cur_dep->next_dep!=NULL){cur_dep=cur_dep->next_dep;}cur_dep->rule=searchRule;cur_dep->next_dep=makeDependency();cur_dep=cur_dep->next_dep;break;}}searchRule=searchRule->next_rule;}if(searchRule->next_rule==NULL){if(i==0){Rule*oldcur=cur;cur->target=args[0];cur->dependencies=makeDependency();cur_dep=cur->dependencies;cur->actions=makeAction();for(intj=2;j<sizeof(args);j++){cur_dep->rule=makeRule();cur_dep->rule->target=args[j];cur_dep->next_dep=makeDependency();cur_dep=cur_dep->next_dep;cur->next_rule=cur_dep->rule;cur=cur->next_rule;}cur->next_rule=makeRule();cur=oldcur;break;}elseif(i>=2){Rule*newcur=rules;while(newcur->next_rule!=NULL){newcur=newcur->next_rule;}Rule*new_rule=makeRule();new_rule->target=args[i];newcur->next_rule=new_rule;cur_dep->rule=new_rule;cur_dep->next_dep=makeDependency();cur_dep=cur_dep->next_dep;break;}}}}}returnrules;}