diff options
Diffstat (limited to 'jsdoc/c-transpiler.js')
-rw-r--r-- | jsdoc/c-transpiler.js | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/jsdoc/c-transpiler.js b/jsdoc/c-transpiler.js new file mode 100644 index 0000000..55bc617 --- /dev/null +++ b/jsdoc/c-transpiler.js @@ -0,0 +1,58 @@ +/* + * c-transpiler.js - transpile C to JS while retaining line numbers. + * + * Copyright (C) 2023 Jo-Philipp Wich <jo@mein.io> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +'use strict'; + +exports.handlers = { + beforeParse: function(e) { + if (!e.filename.match(/\.(c|h)$/)) + return; + + let chunks = [ { start: 0, end: -1, comment: false } ]; + let chunk = chunks[0]; + let i = 0; + + for (i = 0; i < e.source.length; i++) { + if (!chunk.comment && e.source[i] == '\n' && e.source[i+1] == '/' && e.source[i+2] == '*' && e.source[i+3] == '*') { + chunk.end = i; + chunk = { start: i, end: -1, comment: true }; + chunks.push(chunk); + i += 3; + } + else if (chunk.comment && e.source[i] == '*' && e.source[i+1] == '/') { + chunk.end = i + 1; + chunk = { start: i + 1, end: -1, comment: false }; + chunks.push(chunk); + i += 1; + } + } + + chunk.end = i; + + let source = ''; + + for (chunk of chunks) { + if (chunk.comment) + source += e.source.substring(chunk.start, chunk.end); + else + source += e.source.substring(chunk.start, chunk.end).replace(/(^|\n)/g, '$1//'); + } + + e.source = source; + } +}; |