C search and replace string program

Linux IT
The other day I needed to write a C function which search and replace all tokens in a char * aka C strings. Searching on google doesn't returned too many promising results, hence I ended up writing my own function. Here it goes:
/*
* casr --- C based search and replace program in a char *
*
* Author: Usman Saleem - [email protected]
*
* This code is released under The MIT License.
* http://www.opensource.org/licenses/mit-license.php
*
* Copyrights (c) 2010, Usman Saleem.
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
* The search and replace function attempts to replace
* 'token' with 'replacement' on a copy of 'line'.
* Returns:
* - NULL for invalid arguments or out of memory
* - 'line' reference if nothing to replace
* - char * with all tokens replaced.
*
* The caller should call free if the reference to 'line' and
* returned value is different
*/
char * csar(char *line, char *token, char *replacement)
{
    char *result, *finalresult; /* the return string */
    int token_length; /* length of token */
    int replacement_length; /* length of replacement */
    int count;  /* number of replacements */
    char *tmp;
    char *curr;
    int diff;
    /* Basic sanity of arguments */
    if (!line)
    return NULL;
    if (!token || !(token_length = strlen (token)))
    return NULL;
    if (!replacement || !(replacement_length = strlen (replacement)))
    return NULL;
    /*return same line if there is nothing to replace */
    if (!(strstr (line, token)))
    return line;
    curr = line;
    /*determine count of tokens */
    for(count = 0; tmp = strstr(curr,token); count++)
    {
        curr = tmp+token_length;
    }
    /*allocate memory*/
    finalresult = result = malloc(strlen(line) + (replacement_length*count) + 1 - (token_length*count));
    if(!result)
    {
        return NULL; /*out of memory?*/
    }
    /*move to beginning of line*/
    curr = line;
    for(;;)
    {
        /*determine next location of token */
        tmp = strstr(curr, token);
        if(!tmp) break;
        diff = tmp - curr;
        strncpy(result, curr, diff); /*copy the pre-token part*/
        strcpy(result+diff, replacement); /*copy replacement*/
        strcpy(result+diff+replacement_length, tmp+token_length); /*copy rest of stuff*/
        /*move to next token position*/
        curr = curr+diff+token_length;
        /*update result position to next replace position*/
        result = result+diff+replacement_length;
    }
    return finalresult;
}
int main(void)
{
    char *line1="";
    char *line2="abcdef";
    char *line3="[email protected]@@def@";
    char *line4="@middle@";
    char *line5="@";
    char *line6="@@@";
    printf("line1: %s replaced with %s\n",line1, csar(line1, "@", "xxATxx"));
    printf("line2: %s replaced with %s\n",line2, csar(line2, "@", "xxATxx"));
    printf("line4: %s replaced with %s\n",line4, csar(line4, "@", "xxATxx"));
    printf("line5: %s replaced with %s\n",line5, csar(line5, "@", "xxATxx"));
    printf("line6: %s replaced with %s\n",line6, csar(line6, "@", "xxATxx"));
    char *temp = csar(line3, "@", "xxATxx");
    char *temp1 = csar(temp, ".", "xxDOTxx");
    printf("line3: %s replaced with %s\n",line3,temp1 );
}