Listing 5

#include "makedef.h"

#define WHITESPACE       "\t\n"

TARGET *parse_makefile(int argc, char *argv[], char *target)
{
FILE   *fp;
TARGET *head = NULL;
TARGET *current = NULL;
char   makefile[ DEP LEN ] = {0};
char   buffer[ CMD_LEN ];
char   *token;

parse_options(argc, argv, makefile, target);
if (NULL == (fp = strlen(makefile) ?
   fopen(makefile, "r") : fopen("Makefile", "r")))
      fatal_error("could not find makefile");

while (fgets(buffer, CMD_LEN, fp)) {
   if (!isspace(buffer[0])) {
      token = strtok(buffer, WHITESPACE);
      if (!head && !strlen(target))
          strcpy(target, token);
      current = add target(&head, token);
      token = strtok(NULL, WHITESPACE);
      if (!token || strcmp(":", token))
         fatal_error("target must be followed by ':'");
      while (token = strtok(NULL, WHITESPACE))
          insert_dependency(current, token);
   } else {
      if (!head)
        fatal_error("command must be preceeded by a target");
      else if (token = skip_ws(buffer))
          insert_cmd(current, token);
   }
}

fclose(fp);
return head;
}


char    *skip_ws(char *s)
{
while (isspace(*s)) s++;
return (('\O'== *s) ? NULL : s);
}


TARGET *add_target(TARGET **head, char *target)
{
TARGET *p;

if (search_target_list(*head, target))
   fatal_error("duplicate target found");
p = (TARGET *) malloc(sizeof(TARGET));

if (p) {
   p->link = *head;
   strcpy{p->target, target);
   p->cmdlink = (CMD *) NULL;
   p->deplink = (DEP *) NULL;
   p->color = WHITE;
   *head = p;
}
return p;
}


DEP     *insert_dependency(TARGET *p, char *dependency)
{
DEP     *q;

q = (DEP *) malloc(sizeof(DEP));

if (q) {
   q->link = p->deplink;
   strcpy(q->depstr, dependency);
   p->deplink = q;
}
return q;
}


CMD     *insert_cmd(TARGET *p, char *cmd)
{
CMD     *q, *r;

q = (CMD *) malloc(sizeof(CMD));

if (q) {
   q->link = NULL;
   strcpy(q->cmdstr, cmd);
   q->cmdstr[strlen(q->cmdstr) - 1] = '\O';
   if (r = p->cmdlink) {
      while (r->link)
         r = r->link;
      r->link = q;
   } else
      p->cmdlink = q;
}
return q;
}
/* End of File */