Nice. It has some really useful features.
One suggestion though:
Instead of reading X number of lines if data file is set to 'not-all-at-once' mode, wouldn't it be easier to read until [mark] ?
That would allow to re-draw only new values. Then you can set a switch, so empty fields are either filled using default values (from separate file maybe), or left alone with their previous values. Could be useful in some games, when the data gathering process is time consuming or callback triggered.
EDIT:
I see that a data map is made statically, column/row, so above idea would not work. In my old X:TC plugin I was looking for the 1st column and then run appropriate parsing code (in a nasty if block - that was evil, you don't wanna do that).
In Perl I often use similar technique, were I make hashes with code refs - I just didn't know how to do that in C.
However, that do not apply very well to X:TC case, where it could be better to re-arrange the game data file to achieve your desired grouping (as player data is in several rows)
Anyhow, if you replace the ROW with KEYWORD (where it's regexed like /^KEYWORD:/) your data map could work like this:
[Definitions]
Player: Name 1,Pilot
Player: Money 1,Account
Player: Time Played 1,Time seconds>time
Player: Insurance 1,Insurance
Instead of:
[Definitions]
Player: Name 1,0
Player: Money 1,3
Player: Time Played 1,4 seconds>time
Player: Insurance 1,24
given the data source file like:
Pilot: Erin Iovis
Ships: 2
Stations: 0
Account: 878,596
Time: 22186
Argon: Argon Federation Associate:52
Boron: Boron Suspected Foe:-11
Split: Split Suspected Foe:-15
Paranid: Paranid Suspected Foe:-12
Teladi: Teladi Federation Associate:65
Goner: Goner Citizen:5
Terran: Terran Confirmed Friend:120
ATF: ATF Confirmed Friend:100
Pirates: Pirates Confirmed Insurgent:-10000
Yaki: Yaki Confirmed Insurgent:-10000
ShipClass: 0:0:0:1:1:0:0:0:0:0:0:0
Bars: 100:100:3000:3000
ShipName: Your Sabre:M4:YM4XJ-17:0
ShipEnv: Shipyard(Mars)
Target:
Combat: Veteran:389
Trade: Opportunist:0
Missiles: 0
Enemies: 0
Insurance: 0
I can see several uses of that

Implementation is fairly simple:
Init:
parse -> map to line numbers, cache
each read:
if (LineCount != previousLineCount) rebuild line mapping
What do you think? Will be very useful for the things like the wingman stuff, so wingman data can be stored in such a way in data file:
Wingman: 1:0:0:0:1:1:0:0:0:0:0:0:0
Wingman: 2:0:0:0:2:1:0:0:0:0:0:0:0
Wingman: 3:0:0:0:1:1:3:0:0:0:0:0:0
This line is similar to ShipClass line, with just wingman index in front. With line numbers as they are now, adding flexible wingman info is probably not possible.
END EDIT
I got some doubts as for this XML data type - do you really need to put it in such variable? Is it not easier to check if the first line is [xxx] or <?xml...> ?
Sorry for being a d..k though, too many code reviews done today, I'm still in a zone I guess

Keep in mind I speak from Perl perspective, I don't know how hard would such a regex be in C

Btw, I would like to use this occasion to say big Thank Your for the LCDHost to SirReal.