Mercurial > projects > dil
changeset 712:f8875ef9a66d
Added function sanitize() to dil.doc.Doc.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Wed, 30 Jan 2008 18:29:23 +0100 |
parents | 4f971f6382c7 |
children | 1bfae3480fdc |
files | trunk/src/dil/doc/Doc.d |
diffstat | 1 files changed, 57 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/dil/doc/Doc.d Wed Jan 30 18:28:21 2008 +0100 +++ b/trunk/src/dil/doc/Doc.d Wed Jan 30 18:29:23 2008 +0100 @@ -5,6 +5,8 @@ module dil.doc.Doc; import dil.ast.Node; +import dil.lexer.Funcs; +import common; bool isDoxygenComment(Token* token) { // Doxygen: '/+!' '/*!' '//!' @@ -68,3 +70,58 @@ } return comments; } + +bool isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\v' || c == '\f'; +} + +/// Sanitizes a DDoc comment string. +/// The various newline types are converted to '\n'. +/// Params: +/// comment = the string to be sanitized. +/// commentChar = '/', '+', or '*' +string sanitize(string comment, char commentChar) +{ + string result = comment.dup ~ '\0'; + + assert(result[$-1] == '\0'); + bool newline = true; // Indicates whether a newline has been encountered. + uint i, j; + for (; i < result.length; i++) + { + if (newline) + { // Ignore commentChars at the beginning of each new line. + newline = false; + while (isspace(result[i])) + { i++; } + while (result[i] == commentChar) + { i++; } + } + // Check for Newline. + switch (result[i]) + { + case '\r': + if (result[i+1] == '\n') + i++; + case '\n': + result[j++] = '\n'; // Copy Newline as '\n'. + newline = true; + continue; + default: + if (isUnicodeNewline(result.ptr + i)) + { + i++; i++; + goto case '\n'; + } + } + // Copy character. + result[j++] = result[i]; + } + result.length = j; // Adjust length. + // Lastly, strip trailing commentChars. + i = result.length - (1 + 1); + while (i && result[i] == commentChar) + { i--; } + return result; +}