145 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			145 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								const fs = require('fs');
							 | 
						||
| 
								 | 
							
								const path = require('path');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const headers = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function miniPreprocessor(source) {
							 | 
						||
| 
								 | 
							
									const normal = 0;
							 | 
						||
| 
								 | 
							
									const lineStart = 1;
							 | 
						||
| 
								 | 
							
									const pragma = 2;
							 | 
						||
| 
								 | 
							
									let mode = lineStart;
							 | 
						||
| 
								 | 
							
									let currentPragma = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									let processed = '';
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									for (let i = 0; i < source.length; ++i) {
							 | 
						||
| 
								 | 
							
										if (mode === normal) {
							 | 
						||
| 
								 | 
							
											if (source.charAt(i) === '\n' || source.charAt(i) === '\r') {
							 | 
						||
| 
								 | 
							
												mode = lineStart;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											processed += source.charAt(i);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else if (mode === lineStart) {
							 | 
						||
| 
								 | 
							
											if (source.charAt(i) === '#') {
							 | 
						||
| 
								 | 
							
												currentPragma = '';
							 | 
						||
| 
								 | 
							
												mode = pragma;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											else if (source.charAt(i) === '\n' || source.charAt(i) === '\r') {
							 | 
						||
| 
								 | 
							
												processed += source.charAt(i);
							 | 
						||
| 
								 | 
							
												mode = lineStart;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											else {
							 | 
						||
| 
								 | 
							
												processed += source.charAt(i);
							 | 
						||
| 
								 | 
							
												mode = normal;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else if (mode === pragma) {
							 | 
						||
| 
								 | 
							
											if (source.charAt(i) === '\n' || source.charAt(i) === '\r') {
							 | 
						||
| 
								 | 
							
												if (currentPragma.startsWith('include')) {
							 | 
						||
| 
								 | 
							
													let start = currentPragma.indexOf('<');
							 | 
						||
| 
								 | 
							
													if (start < 0) {
							 | 
						||
| 
								 | 
							
														start = currentPragma.indexOf('"');
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													let end = currentPragma.lastIndexOf('>');
							 | 
						||
| 
								 | 
							
													if (end < 0) {
							 | 
						||
| 
								 | 
							
														end = currentPragma.lastIndexOf('"');
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													if (start >= 0 && end >= 0 && currentPragma.length > start + 1) {
							 | 
						||
| 
								 | 
							
														const headerPath = currentPragma.substring(start + 1, end);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if (currentPragma.substring(start + 1).startsWith('kinc')) {
							 | 
						||
| 
								 | 
							
															let filePath = null;
							 | 
						||
| 
								 | 
							
															if (headerPath.includes('FileReaderImpl') || headerPath.includes('Android')) {
							 | 
						||
| 
								 | 
							
																if (!headers[headerPath]) {
							 | 
						||
| 
								 | 
							
																	headers[headerPath] = true;
							 | 
						||
| 
								 | 
							
																	processed += '#' + currentPragma + source.charAt(i);
							 | 
						||
| 
								 | 
							
																}
							 | 
						||
| 
								 | 
							
															}
							 | 
						||
| 
								 | 
							
															else {
							 | 
						||
| 
								 | 
							
																if (headerPath.startsWith('kinc/backend')) {
							 | 
						||
| 
								 | 
							
																	filePath = path.resolve('Backends', 'System', 'Microsoft', 'Sources', headerPath);
							 | 
						||
| 
								 | 
							
																}
							 | 
						||
| 
								 | 
							
																else {
							 | 
						||
| 
								 | 
							
																	filePath = path.resolve('Sources', headerPath);
							 | 
						||
| 
								 | 
							
																}
							 | 
						||
| 
								 | 
							
															
							 | 
						||
| 
								 | 
							
																if (!headers[headerPath]) {
							 | 
						||
| 
								 | 
							
																	headers[headerPath] = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																	let header = fs.readFileSync(filePath, {encoding: 'utf8'});
							 | 
						||
| 
								 | 
							
																	console.log('Preprocessing ' + filePath);
							 | 
						||
| 
								 | 
							
																	header = miniPreprocessor(header);
							 | 
						||
| 
								 | 
							
																	processed += header;
							 | 
						||
| 
								 | 
							
																}
							 | 
						||
| 
								 | 
							
															}
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
														else {
							 | 
						||
| 
								 | 
							
															if (!headers[headerPath]) {
							 | 
						||
| 
								 | 
							
																headers[headerPath] = true;
							 | 
						||
| 
								 | 
							
																processed += '#' + currentPragma + source.charAt(i);
							 | 
						||
| 
								 | 
							
															}
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else {
							 | 
						||
| 
								 | 
							
														processed += '#' + currentPragma + source.charAt(i);
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												else if (currentPragma.startsWith('pragma once')) {
							 | 
						||
| 
								 | 
							
													// ignore
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												else {
							 | 
						||
| 
								 | 
							
													processed += '#' + currentPragma + source.charAt(i);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												mode = lineStart;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											else {
							 | 
						||
| 
								 | 
							
												currentPragma += source.charAt(i);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else {
							 | 
						||
| 
								 | 
							
											throw 'Unknown mode';
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return processed;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function findHeader(headerPath) {
							 | 
						||
| 
								 | 
							
									const cachedHeader = headers[headerPath];
							 | 
						||
| 
								 | 
							
									if (cachedHeader) {
							 | 
						||
| 
								 | 
							
										return cachedHeader;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const filePath = path.resolve('Sources', headerPath);
							 | 
						||
| 
								 | 
							
									let header = fs.readFileSync(filePath, {encoding: 'utf8'});
							 | 
						||
| 
								 | 
							
									header = header.replace('#pragma once', '');
							 | 
						||
| 
								 | 
							
									for (const headerPath in headers) {
							 | 
						||
| 
								 | 
							
										header = header.replace('#include <' + headerPath + '>', '');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									header = header.trim();
							 | 
						||
| 
								 | 
							
									headers[headerPath] = header;
							 | 
						||
| 
								 | 
							
									return header;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function insertHeaders(file, headerPaths) {
							 | 
						||
| 
								 | 
							
									for (const headerPath of headerPaths) {
							 | 
						||
| 
								 | 
							
										file = file.replace('#include <' + headerPath + '>', findHeader(headerPath));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return file;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const audio2_header = fs.readFileSync(path.resolve('Sources', 'kinc', 'audio2', 'audio.h'), {encoding: 'utf8'});
							 | 
						||
| 
								 | 
							
								let lib = '#pragma once\n' + miniPreprocessor(audio2_header);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let windows_backend = fs.readFileSync(path.resolve('Backends', 'Audio2', 'WASAPI', 'Sources', 'kinc', 'backend', 'wasapi.c'), {encoding: 'utf8'});
							 | 
						||
| 
								 | 
							
								windows_backend = windows_backend.replace('#include <kinc/audio2/audio.h>', '');
							 | 
						||
| 
								 | 
							
								windows_backend = miniPreprocessor(windows_backend);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								lib = lib.replace('// BACKENDS-PLACEHOLDER', '#ifdef KINC_WINDOWS\n' + windows_backend + '\n#endif');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (!fs.existsSync('single_header_libs')) {
							 | 
						||
| 
								 | 
							
									fs.mkdirSync('single_header_libs');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								fs.writeFileSync(path.resolve('single_header_libs', 'kinc_audio2.h'), lib, {encoding: 'utf8'});
							 |