104 lines
2.2 KiB
Dart
104 lines
2.2 KiB
Dart
import 'package:ini_parser/extensions.dart';
|
|
|
|
class PreProcessor {
|
|
PreProcessor({
|
|
required this.raw,
|
|
required this.settings,
|
|
});
|
|
late final String raw;
|
|
late final List<String> settings;
|
|
final List<String> lines = [];
|
|
final Map<String, List<String>> defines = {};
|
|
|
|
/// Pre-process INI:
|
|
/// - remove comments
|
|
/// - remove empty lines
|
|
/// - handle #if, #else, #endif, #set, #unset
|
|
/// - handle #define
|
|
void process() {
|
|
lines.clear();
|
|
var ifClauseOpen = false;
|
|
var elseClauseOpen = false;
|
|
var ifConditionTrue = false;
|
|
|
|
for (var line in raw.split('\n')) {
|
|
line = line.trim();
|
|
|
|
// ignore comments and empty lines
|
|
if (line.startsWith(';') || line.isEmpty) {
|
|
continue;
|
|
}
|
|
|
|
// remove inline comments
|
|
if (line.contains(';')) {
|
|
line = line.substring(0, line.indexOf(';'));
|
|
}
|
|
|
|
if (line.startsWith('#if')) {
|
|
ifClauseOpen = true;
|
|
ifConditionTrue = settings.contains(line.substring(3).trim());
|
|
|
|
continue;
|
|
}
|
|
|
|
if (line.startsWith('#else')) {
|
|
elseClauseOpen = true;
|
|
ifClauseOpen = false;
|
|
|
|
continue;
|
|
}
|
|
|
|
if (line.startsWith('#endif')) {
|
|
ifClauseOpen = false;
|
|
elseClauseOpen = false;
|
|
|
|
continue;
|
|
}
|
|
|
|
if (ifClauseOpen == true) {
|
|
if (ifConditionTrue == true) {
|
|
lines.add(line);
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
if (elseClauseOpen == true) {
|
|
if (ifConditionTrue == false) {
|
|
lines.add(line);
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
// add new Settings entry
|
|
if (line.startsWith('#set')) {
|
|
settings.add(line.substring(4).trim());
|
|
|
|
continue;
|
|
}
|
|
|
|
// unset/remove Settings entry
|
|
if (line.startsWith('#unset')) {
|
|
settings.remove(line.substring(6).trim());
|
|
|
|
continue;
|
|
}
|
|
|
|
if (line.startsWith('#define')) {
|
|
final parts = line.substring(7).trim().split('=');
|
|
final key = parts[0].sanitize();
|
|
final values = parts[1].sanitize().split(',').map((e) => e.sanitize());
|
|
|
|
defines.addAll({
|
|
key: values.toList(),
|
|
});
|
|
|
|
continue;
|
|
}
|
|
|
|
lines.add(line);
|
|
}
|
|
}
|
|
}
|