#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <err.h>
#include <errno.h>
#include <sys/wait.h>
#include "../lpi.h"

struct Node {
    int data;
    int prntIdx;
    struct Node *next;
};

struct Node idx[50];

void traverse(void);
void tree(struct Node *node, int level, char terminator);
void proc(int pid, int ppid);
int getIdx(int data);

int lst = 0;

int
main(int argc, char *argv[])
{
    char buf[BUFSIZ];
    char *s;
    int chld, prnt;


    //proc(getpid(), getppid());

    while (fgets(buf, BUFSIZ, stdin)) {
        s = strtok(buf, " ");
        if (s)
            chomp(s);

        if ((errno = toInt(s, &chld)) != 0)
            err(EXIT_FAILURE, "toInt('%s')", s);

        s = strtok(NULL, " ");
        if (s)
            chomp(s);

        if ((errno = toInt(s, &prnt)) != 0)
            err(EXIT_FAILURE, "toInt('%s')", s);

        //printf("%d %d\n", chld, prnt);
        proc(chld, prnt);
    }

    //tree(idx, 0, '\n');
    traverse();
    exit(EXIT_SUCCESS);
}

void
proc(int chld, int prnt)
{
    int i;
    struct Node *node, *ptr;

    if ((node = (struct Node *) malloc(sizeof(struct Node))) == NULL)
        err(EXIT_FAILURE, "malloc");

    node->data = chld;
    node->prntIdx = getIdx(node->data);

    for (i = 0; i < lst; i++) {
        if (idx[i].data == prnt) {
            if (idx[i].next == NULL) {
                idx[i].next = node;
                return;
            }
            ptr = idx[i].next;
            while (ptr->next)
                ptr = ptr->next;
            ptr->next = node;
            return;
        }
    }
    idx[i].data = prnt;
    idx[i].next = node;
    lst = i + 1;
}

int
getIdx(int data)
{
    int i;

    for (i = 0; i < lst; i++)
        if (idx[i].data == data)
            return i;

    idx[i].data = data;
    idx[i].prntIdx = 0;
    idx[i].next = NULL;

    lst = i + 1;
    return i;
}
void
tree(struct Node *node, int level, char terminator)
{
    if (!node)
        return;

    while (node) {
        printf("%*s%d%c", level * 4, "", node->data, terminator);
        if (node->prntIdx)
            tree(&idx[node->prntIdx], 0,  ' ');
        tree(node->next, 0, ' ');
        node = node->next;
    }
}

void
traverse(void)
{
    struct Node *ptr;

    for (int i = 0; i < lst; i++) {
        printf("%d-->", idx[i].data);

        ptr = idx[i].next;

        while (ptr) {
            printf("%d(%d)", ptr->data, ptr->prntIdx);
            ptr = ptr->next;
        }
        printf("\n");
    }
}
