Error On Duplicates
This commit is contained in:
parent
371a18b1e5
commit
930eae47c6
@ -30,6 +30,9 @@ while (process.argv.length > 0) {
|
|||||||
let name = parts[parts.length - 1]!;
|
let name = parts[parts.length - 1]!;
|
||||||
name = name.substring(0, name.length - EXTENSION.length);
|
name = name.substring(0, name.length - EXTENSION.length);
|
||||||
// Store
|
// Store
|
||||||
|
if (name in STRUCTURE_FILES) {
|
||||||
|
throw new Error(`Multiple Definition Files Provided: ${name}${EXTENSION}`);
|
||||||
|
}
|
||||||
STRUCTURE_FILES[name] = file;
|
STRUCTURE_FILES[name] = file;
|
||||||
} else if (file.endsWith('.h')) {
|
} else if (file.endsWith('.h')) {
|
||||||
// Extra Headers
|
// Extra Headers
|
||||||
|
@ -49,6 +49,9 @@ export class Struct {
|
|||||||
return Math.ceil(size / alignment) * alignment;
|
return Math.ceil(size / alignment) * alignment;
|
||||||
}
|
}
|
||||||
getSize(round: boolean) {
|
getSize(round: boolean) {
|
||||||
|
if (this.#isUndefined()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
let size;
|
let size;
|
||||||
if (this.#size !== null) {
|
if (this.#size !== null) {
|
||||||
size = this.#size;
|
size = this.#size;
|
||||||
@ -116,6 +119,11 @@ export class Struct {
|
|||||||
this.#vtable!.setAddress(address);
|
this.#vtable!.setAddress(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check If Structure Is Undefined
|
||||||
|
#isUndefined() {
|
||||||
|
return this.#properties.length === 0 && this.#size === null;
|
||||||
|
}
|
||||||
|
|
||||||
// Check
|
// Check
|
||||||
#check() {
|
#check() {
|
||||||
// Sort Properties
|
// Sort Properties
|
||||||
@ -140,6 +148,43 @@ export class Struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compute Padding Between Properties
|
||||||
|
#computePadding(a: Property | null, b: Property | null) {
|
||||||
|
// Null A = Start Of Structure
|
||||||
|
// Null B = End Of Structure
|
||||||
|
let neededPadding = 0;
|
||||||
|
if (a === null) {
|
||||||
|
// Start Of Structure Padding
|
||||||
|
if (b !== null) {
|
||||||
|
neededPadding = b.propertyOffset();
|
||||||
|
} else {
|
||||||
|
// Both A And B Are Null
|
||||||
|
if (this.#size !== null) {
|
||||||
|
neededPadding = this.#size;
|
||||||
|
} else {
|
||||||
|
neededPadding = MIN_SIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (b === null) {
|
||||||
|
// End Of Structure Padding
|
||||||
|
if (this.#size !== null) {
|
||||||
|
const realSize = a.propertyOffset() + a.propertySize();
|
||||||
|
const realRoundedSize = this.#roundSize(realSize);
|
||||||
|
if (realRoundedSize !== this.#size) {
|
||||||
|
neededPadding = this.#size - realSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Inner Structure Padding
|
||||||
|
const realSizeSoFar = a.propertyOffset() + a.propertySize();
|
||||||
|
neededPadding = b.propertyOffset() - realSizeSoFar;
|
||||||
|
}
|
||||||
|
if (neededPadding < 0) {
|
||||||
|
throw new Error('Overlapping properties detected!');
|
||||||
|
}
|
||||||
|
return neededPadding;
|
||||||
|
}
|
||||||
|
|
||||||
// Generate Header
|
// Generate Header
|
||||||
generate() {
|
generate() {
|
||||||
let out = '';
|
let out = '';
|
||||||
@ -160,7 +205,7 @@ export class Struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Early Exit For Undefined Structures
|
// Early Exit For Undefined Structures
|
||||||
if (this.#properties.length === 0 && this.#size === null) {
|
if (this.#isUndefined()) {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,46 +217,17 @@ export class Struct {
|
|||||||
// Structure
|
// Structure
|
||||||
out += `struct ${this.#name} {\n`;
|
out += `struct ${this.#name} {\n`;
|
||||||
for (let i = 0; i <= this.#properties.length; i++) {
|
for (let i = 0; i <= this.#properties.length; i++) {
|
||||||
const property = this.#properties[i];
|
const property = i < this.#properties.length ? this.#properties[i]! : null;
|
||||||
|
|
||||||
// Padding
|
// Padding
|
||||||
const lastProperty = this.#properties[i - 1];
|
const lastProperty = (i >= 1 && (i - 1) < this.#properties.length) ? this.#properties[i - 1]! : null;
|
||||||
let neededPadding = 0;
|
const neededPadding = this.#computePadding(lastProperty, property);
|
||||||
if (i === 0) {
|
|
||||||
// Start Of Structure Padding
|
|
||||||
if (property) {
|
|
||||||
neededPadding = property.propertyOffset();
|
|
||||||
} else if (this.#properties.length === 0) {
|
|
||||||
if (this.#size !== null) {
|
|
||||||
neededPadding = this.#size;
|
|
||||||
} else {
|
|
||||||
neededPadding = MIN_SIZE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (i === this.#properties.length) {
|
|
||||||
// End Of Structure Padding
|
|
||||||
if (this.#size !== null && lastProperty) {
|
|
||||||
const realSize = lastProperty.propertyOffset() + lastProperty.propertySize();
|
|
||||||
const realRoundedSize = this.#roundSize(realSize);
|
|
||||||
if (realRoundedSize !== this.#size) {
|
|
||||||
neededPadding = this.#size - realSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Inner Structure Padding
|
|
||||||
if (property && lastProperty) {
|
|
||||||
const realSize = lastProperty.propertyOffset() + lastProperty.propertySize();
|
|
||||||
neededPadding = property.propertyOffset() - realSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (neededPadding > 0) {
|
if (neededPadding > 0) {
|
||||||
out += `${INDENT}uchar padding${i}[${neededPadding}];\n`;
|
out += `${INDENT}uchar padding${i}[${neededPadding}];\n`;
|
||||||
} else if (neededPadding < 0) {
|
|
||||||
throw new Error('Overlapping properties detected!');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Property
|
// Property
|
||||||
if (property) {
|
if (property !== null) {
|
||||||
// Check Offset
|
// Check Offset
|
||||||
const offset = property.propertyOffset();
|
const offset = property.propertyOffset();
|
||||||
const alignment = property.propertyAlignment();
|
const alignment = property.propertyAlignment();
|
||||||
|
Loading…
Reference in New Issue
Block a user