#include "xcp.h"

extern head_path_struct *file_list_head;

extern void get_path(), get_filename();

head_path_struct *map_name_to_dir();
file_list_struct *map_name_to_file();
void list_remove_all_directories(), list_remove_directory(), list_remove_file();

void list_remove_all_directories()
{
  head_path_struct *list_pointer = file_list_head,
                   *prev_list_pointer = file_list_head;
  file_list_struct *file_pointer, *prev_file;

  while(list_pointer){
    prev_file = file_pointer = list_pointer->first_file;
    while(file_pointer){
      file_pointer=file_pointer->next_file;
      XmStringFree(prev_file->name_str);
      XmStringFree(prev_file->fullname_str);
      free(prev_file->fullname);
      free(prev_file);
      prev_file = file_pointer;
    }
    list_pointer = list_pointer->next_path;
    free(prev_list_pointer);
    prev_list_pointer=list_pointer;
  }
  file_list_head=NULL;
}

void list_remove_directory(name)
char *name;
{  /*  this will not find all occurences of the directory in other places... might be wrong...  */
  head_path_struct *prev_list_pointer = file_list_head, 
                   *list_pointer      = file_list_head;
  file_list_struct *file_pointer, *prev;
  
  while (list_pointer){
    if (!strcmp(list_pointer->pathname, name)){
      file_pointer=list_pointer->first_file;
      while(file_pointer){
	prev=file_pointer;
	file_pointer=file_pointer->next_file;
	if (prev->link_info == IS_DIRECTORY)
	  list_remove_directory(prev->fullname);
	free(prev->fullname);
	XmStringFree(prev->name_str);
	XmStringFree(prev->fullname_str);
	free(prev);
      }
      if (list_pointer==prev_list_pointer)
	file_list_head=list_pointer->next_path;
      else
	prev_list_pointer->next_path=list_pointer->next_path;
      free(list_pointer);
      return;
    }
    prev_list_pointer=list_pointer;
    list_pointer=list_pointer->next_path;
  }
}

head_path_struct *map_name_to_dir(name)
char *name;
{
  head_path_struct *temp = file_list_head;

  while (temp){
    if (!strcmp(temp->pathname, name))
      return (temp);
    else
      temp=temp->next_path;
  }
  return(NULL);
}

file_list_struct *map_name_to_file(dir, name)
char *dir, *name;
{
  head_path_struct *temp = file_list_head;
  file_list_struct *temp_file = NULL;

  while (temp)
    if (!strcmp(temp->pathname, dir))
      break;
    else
      temp = temp->next_path;
  if (temp)
    temp_file = temp->first_file;
  while (temp_file)
    if (!strcmp(temp_file->filename, name))
      return(temp_file);
    else
      temp_file= temp_file->next_file;
  return(NULL);
}

void list_remove_file(name)
char *name;
{
  head_path_struct *temp = file_list_head;
  char dir[MAXPATHLEN];
  file_list_struct *temp_file, *prev;

  get_path(name, dir);
  while (temp){
    if (!strcmp(dir,temp->pathname)){
      get_filename(name,dir);
      temp_file = prev = temp->first_file;
      while (temp_file){
	if (!strcmp(temp_file->filename, dir)){
	  if (prev==temp_file)
	    temp->first_file=temp_file->next_file;
	  else
	    prev->next_file = temp_file->next_file;
	  free(temp_file->fullname);
	  XmStringFree(temp_file->name_str);
	  XmStringFree(temp_file->fullname_str);
	  free (temp_file);
	  temp->total_files=temp->total_files-1;
	  return;
	}
	prev=temp_file;
	temp_file=temp_file->next_file;
      }
    }
    temp=temp->next_path;
  }
}
