Difference between revisions of "LEX (File Format)"

From Custom Mario Kart
Jump to navigation Jump to search
m
Line 3: Line 3:
 
'''LEX''' ([[LE-CODE]] Extension) is a file format defined by [[Wiimm]]. A LEX file is usually stored as part of a track [[SZS]] under the name ''course.lex''. It's like KMP's ''course.kmp'', but it provides additional settings and modifications outside of a [[KMP]].
 
'''LEX''' ([[LE-CODE]] Extension) is a file format defined by [[Wiimm]]. A LEX file is usually stored as part of a track [[SZS]] under the name ''course.lex''. It's like KMP's ''course.kmp'', but it provides additional settings and modifications outside of a [[KMP]].
  
'''LEX''' is designed to be open for future extension by third persons. Anyway, each new section identifier (a 4 byte ASCII magic) should be requested to Wiimm. he will guarantee unique identifiers.
+
'''LEX''' is designed to be open for future extension by third persons. Anyway, each new section identifier (a 4 byte ASCII magic) should be requested to Wiimm. He will guarantee unique identifiers.
  
At least [[LE-CODE]] will support '''LEX'''. Maybe CTGP wil do it too.
+
At least [[LE-CODE]] will support '''LEX'''. Maybe CTGP will do it too.
  
  
 
__TOC__
 
__TOC__
  
== Degign Notes ==
+
== Design Notes ==
  
 
There were some prerequisites before the definition of the file format:
 
There were some prerequisites before the definition of the file format:
 
* The format should be open for future extensions.
 
* The format should be open for future extensions.
 
* Extensions are menages by sections. Each section is identified by an unique ID (magic).
 
* Extensions are menages by sections. Each section is identified by an unique ID (magic).
* ID should be 4 ASCII characters to make viewing by a hex-dumper easiser.
+
* ID should be 4 ASCII characters to make viewing by a hex-dumper easier.
 
* Old implementation should work, event if new unknown subtypes were added. Therefore, the code needs an easy skip mechanism.
 
* Old implementation should work, event if new unknown subtypes were added. Therefore, the code needs an easy skip mechanism.
 
* The order must be stable to support sections, that depend on other prior defined sections.
 
* The order must be stable to support sections, that depend on other prior defined sections.
Line 34: Line 34:
 
|-  
 
|-  
 
| 0x04 || 2 || uint16
 
| 0x04 || 2 || uint16
| rowspan=2 | The complete version number is devided into a major number (offset 4) and a minor number (offset 6). The major  version changes, if the data structure changes in an incompatible way. On small changes like adding additional members to this file header, the minor version number is incremented.
+
| rowspan=2 | The complete version number is divided into a major number (offset 4) and a minor number (offset 6). The major  version changes, if the data structure changes in an incompatible way. On small changes like adding additional members to this file header, the minor version number is incremented.
 
|-
 
|-
 
| 0x06 || 2 || uint16
 
| 0x06 || 2 || uint16
 
|-
 
|-
| 0x08 || 4 || uint32 || Total size of file. use it for sanity cheks.
+
| 0x08 || 4 || uint32 || Total size of file. use it for sanity cheeks.
 
|-
 
|-
 
| 0x0c || 4 || uint32 || Offset first element of the chain relative to the beginning of this structure.
 
| 0x0c || 4 || uint32 || Offset first element of the chain relative to the beginning of this structure.
Line 70: Line 70:
 
For example code in C, see »[[LEX (File Format)/C example]]«.
 
For example code in C, see »[[LEX (File Format)/C example]]«.
  
== Sections ==
+
== Elements ==
 
???
 
???
 +
 
=== <span id=cann>CANN : Cannon settings</span> ===
 
=== <span id=cann>CANN : Cannon settings</span> ===
 
???
 
???

Revision as of 22:10, 27 February 2019

Under Construction
This article is not finished. Help improve it by adding accurate information or correcting grammar and spelling.

LEX (LE-CODE Extension) is a file format defined by Wiimm. A LEX file is usually stored as part of a track SZS under the name course.lex. It's like KMP's course.kmp, but it provides additional settings and modifications outside of a KMP.

LEX is designed to be open for future extension by third persons. Anyway, each new section identifier (a 4 byte ASCII magic) should be requested to Wiimm. He will guarantee unique identifiers.

At least LE-CODE will support LEX. Maybe CTGP will do it too.


Design Notes

There were some prerequisites before the definition of the file format:

  • The format should be open for future extensions.
  • Extensions are menages by sections. Each section is identified by an unique ID (magic).
  • ID should be 4 ASCII characters to make viewing by a hex-dumper easier.
  • Old implementation should work, event if new unknown subtypes were added. Therefore, the code needs an easy skip mechanism.
  • The order must be stable to support sections, that depend on other prior defined sections.
  • Fast and easy scanning support.

File Format

Each file starts with a LEX header, followed by a sequence of LEX elements. The chain of elements is closed by a special termination element.

All values are stored in network byte order (big endian). Each element is aligned to 4 bytes.

File header of LEX files
Offset Size Type Description
0x00 4 char File magic, always »LE-X«
0x04 2 uint16 The complete version number is divided into a major number (offset 4) and a minor number (offset 6). The major version changes, if the data structure changes in an incompatible way. On small changes like adding additional members to this file header, the minor version number is incremented.
0x06 2 uint16
0x08 4 uint32 Total size of file. use it for sanity cheeks.
0x0c 4 uint32 Offset first element of the chain relative to the beginning of this structure.
0x10 end of header


The list of elements is managed as chain. The header of each element contains a magic to identify it, and a size:

Element header of LEX files
Offset Size Type Description
0x00 4 uint32 A magic to identify the element (type of element). An alternative datatype is char[4].
0x04 4 uint32 Size of the element data. It is an offset to the next element relative to the data member too. The size is always a multiple of 4.
0x08 SIZE * Binary data of the element.
0x08+SIZE 8+ element The next element.
Some rules
  • Duplicates of the same elements are forbidden.
  • The chain of elements is well ordered. Tools should usually not change this order, except they know exactly what they do.
  • Magic and size of the final element (terminator) are 0.

Example Implementation

For example code in C, see »LEX (File Format)/C example«.

Elements

???

CANN : Cannon settings

???

Links