#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dllist.h"

void setIntersect(Dllist *L1, Dllist *L2) {
  Dllist_Node *p1, *p2, *saveNode;
  int val1, val2;

  p1 = dll_first(L1);
  p2 = dll_first(L2);
  while ((p1 != dll_sentinel(L1)) && (p2 != dll_sentinel(L2))) {
    val1 = *(int *)dll_val(p1);
    val2 = *(int *)dll_val(p2);
    
    if (val1 == val2) {
      p1 = dll_next(p1);
      p2 = dll_next(p2);
    }
    else if (val1 < val2) {
      saveNode = p1;
      p1 = dll_next(p1);
      dll_delete_node(saveNode);
    }
    else { // val1 > val 2
      p2 = dll_next(p2);
    } 
  }
  /* If L1 has elements remaining after L2 has been exhausted,
	then delete the remaining elements from L1 */
  while (p1 != dll_sentinel(L1)) {
      saveNode = p1;
      p1 = dll_next(p1);
      dll_delete_node(saveNode);
  } 
}

main(int argc, char *argv[]) {
  Dllist *list1 = new_dllist();
  Dllist *list2 = new_dllist();
  int i = 1;
  int *val;
  Dllist_Node *ptr;
  while (strcmp(argv[i], "$") != 0) {
    val = (int *)malloc(sizeof(int));
    sscanf(argv[i], "%i", val);
    dll_append(list1, val);
    i++;
  }
  for (i++; i < argc; i++) {
    val = (int *)malloc(sizeof(int));
    sscanf(argv[i], "%i", val);
    dll_append(list2, val);
  }
  setIntersect(list1, list2);
  for (ptr = dll_first(list1);
       ptr != dll_sentinel(list1);
       ptr = dll_next(ptr)) {
    printf("%i\n", *(int *)dll_val(ptr));
  }
}

