The problem with relative move commands is that the start is determined by the path that came before.
Given the example path: "M100,100 l50,25 h25 m25,25 l-50,-25 h-50" how do you find out where the sub path "m25,25 l-50,-25 h-50" starts in absolute terms? You "walk" the path that came before. To that end, we have to keep track of the starting and end points of all sub paths. Every path (empty path) starts at (0,0). If we follow this example path, then:
1. move to 100, 100 -> starting point of the rest is (100,100)
2. draw a line from that point adding 50 horizontally and 25 vertically -> starting point of the rest is (150,125)
3. draw a line from that point adding 25 horizontally -> starting point of the rest is (175, 125)
End of first sub path -> sub path is "M100,100 l50,25 h25"
4. move from point (175, 125) 25 horizontally and 25 vertically -> starting point of the rest is (200, 150)
5. draw a line from that point adding negative 50 horizontally, and negative 25 vertically -> starting point of the rest is (150, 125)
6. draw a line from that point adding negative 50 horizontally -> starting point of the rest is (100, 125)
End of second sub path -> sub path is "M175,125 l-50,-25 h-50"
So, all you have to do is to parse a path, start walking it per command, and determine the starting point in absolute terms of the rest of the path that's still to be walked. If you have a relative move command, replace it with an absolute move command with the starting point you computed just before.
Luckily, there are already path parsers (I linked to one a couple of posts earlier), so the hard part is already done :-)