I wrote my own version of `endswith` just like in high-level programming languages in C which I would like reviews on.

There are 2 versions. One is my own and the other is from [ccan][1]. For some reason, I feel that [ccan][1]'s version is better than mine until proven wrong.

[ccan][1]/str's version:

    static inline bool strends(const char *str, const char *postfix)
    {
    	if (strlen(str) < strlen(postfix))
    		return false;
    
    	return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
    }

My version:

    bool strends(const char *str, const char *postfix)
    {
    	register const char *end = str + strlen(str) - 1;
    	register const char *epostfix = postfix + strlen(postfix) - 1;
    
    	while (end > str && postfix > epostfix)
    		if (*end-- != *epostfix--)
    			return false;
    	return true;
    }

I wonder which one is better and why (in terms of readability, performance and so on).  Please be specific and provide your research if possible.

Thanks in advance.


  [1]: https://github.com/rustyrussell/ccan/