UTF8 Codepoint decode and length v.2
Overall, this seems like a pretty straightforward implementation of the FSM you show. It's understandable, which is great!
Document What It Is
The only thing is, what if someone reading this has never seen the image of the FSM? You should, at the very least, include a comment with a URL showing where the FSM comes from! Or, if you can easily explain it in words, do that.
Don't Do Nothing
What is the point of the fsm and fsmstart macros? They do nothing. I don't mind that you're starting new scope with each one, but an empty macro seems pointless. You could just as easily use a comment. It would be confusing to someone reading the code for the first time, thinking they did something.
Be Careful With Macros
While we're no the subject of macros... What's the point of the other macros? The fsmSTATE macro saves you no typing at all, and doesn't appear to have any other function. Just use the label directly in your code. The fsmGOTO label saves you a little typing but doesn't really seem all that useful. Macros are known to have a number of dangerous issues, so it's best to avoid them if at all possible.
Don't Use Magic Numbers
What is state 6? State 4? What is the significance of the numbers? Reading the linked page, it sounds like they are character classes or something like that. Would it be possible to have named constants that make this more obvious?
Be Careful With Multiple Statements in a Single Line
You have a lot of places where you've written several statements on the same line, like this:
s++; if ( *s &lt; 0x80 || 0xbf &lt; *s) fsmGOTO(invalid);

This can be problematic for a number of reasons. First, it's difficult to debug. When you're stepping through the code in a debugger, it can be very difficult to tell which statement had what effect. Second, it's hard to read.