Compare, squeeze and reverse C strings

Comparing two strings:

int compare(const char *str1, const char *str2)
{
  // base case
  if (*str1 == '\0' && *str2 == '\0')
    return 1;
  // heads match, check tails
  else if (*str1 == *str2)
      return compare(++str1, ++str2);
  return 0;
}

Squeezing a character:

void squeeze(const char *in, char *out)
{
  while (*in == ' ')
    in++;  
  if (*in == '\0')
    {
      *(++out) = '\0';
      return;
    }
  else
    {
      *out = *in;
      return squeeze(++in, ++out);
    }
}

Reversing a string (inplace, smart way)

void inplace(char *str) 
{
  char tmp;
  char *end = str;
  while (*end) { end++; }
  end--;

  while (str < end) {
    tmp = *str;
    *str++ = *end;
    *end-- = tmp;
  }
}

Reversing a string (the stupid way with recursion)

// start = 0, end = strlen(in)-1
void reverse(const char in[], char out[], unsigned int start, int end)
{
  if (start == strlen(in))
    return;
  out[start] = in[end];
  reverse(in, out, ++start, --end );
}