Handle newlines and comments correctly

Newlines have to be handled before comments or comments won't be able to
handle line endings that don't include at least one LF character.

Also, document an obscure comment syntax: Anything that follows a '*'
placed at the start of a line is also a comment until the end of the
line.

Signed-off-by: Antonio Niño Díaz <antonio_nd@outlook.com>
This commit is contained in:
Antonio Niño Díaz
2018-02-22 22:11:30 +00:00
parent 2ed937db2c
commit 3bebedf1f8
3 changed files with 45 additions and 7 deletions

View File

@@ -42,6 +42,12 @@ Example:
<div class="Pp"></div>
All pseudo&#x2010;ops, mnemonics and registers (reserved keywords) are
case&#x2010;insensitive and all labels are case&#x2010;sensitive.
<div class="Pp"></div>
There are two syntaxes for comments. In both cases, a comment ends at the end of
the line. The most common one is: anything that follows a semicolon
&quot;;&quot; (that isn't inside a string) is a comment. There is another
format: anything that follows a &quot;*&quot; that is placed right at the
start of a line is a comment.
<h2 class="Ss" title="Ss" id="Sections"><a class="selflink" href="#Sections">Sections</a></h2>
Before you can start writing code, you must define a section. This tells the
assembler what kind of information follows and, if it is code, where to put

View File

@@ -159,6 +159,8 @@ YY_BUFFER_STATE yy_create_buffer(FILE *f)
pBuffer->pBuffer[size + 1] = 0;
pBuffer->nBufferSize = size + 1;
/* Convert all line endings to LF and spaces */
char *mem = pBuffer->pBuffer;
uint32_t instring = 0;
@@ -171,20 +173,44 @@ YY_BUFFER_STATE yy_create_buffer(FILE *f)
} else if (instring) {
mem += 1;
} else {
if ((mem[0] == 10 && mem[1] == 13)
|| (mem[0] == 13 && mem[1] == 10)) {
/* LF CR and CR LF */
if (((mem[0] == 10) && (mem[1] == 13))
|| ((mem[0] == 13) && (mem[1] == 10))) {
mem[0] = ' ';
mem[1] = '\n';
mem += 2;
} else if (mem[0] == 10 || mem[0] == 13) {
/* LF and CR */
} else if ((mem[0] == 10) || (mem[0] == 13)) {
mem[0] = '\n';
mem += 1;
} else if (mem[0] == '\n' && mem[1] == '*') {
} else {
mem += 1;
while (!(*mem == '\n' || *mem == '\0'))
}
}
}
/* Remove comments */
mem = pBuffer->pBuffer;
instring = 0;
while (*mem) {
if (*mem == '\"')
instring = 1 - instring;
if ((mem[0] == '\\') && (mem[1] == '\"' || mem[1] == '\\')) {
mem += 2;
} else if (instring) {
mem += 1;
} else {
/* Comments that start with ; anywhere in a line */
if (*mem == ';') {
while (!((*mem == '\n') || (*mem == '\0')))
*mem++ = ' ';
} else if (*mem == ';') {
while (!(*mem == '\n' || *mem == '\0'))
/* Comments that start with * at the start of a line */
} else if ((mem[0] == '\n') && (mem[1] == '*')) {
mem += 1;
while (!((*mem == '\n') || (*mem == '\0')))
*mem++ = ' ';
} else {
mem += 1;

View File

@@ -30,6 +30,12 @@ Example:
.Pp
All pseudoops, mnemonics and registers (reserved keywords) are caseinsensitive
and all labels are casesensitive.
.Pp
There are two syntaxes for comments. In both cases, a comment ends at the end of
the line. The most common one is: anything that follows a semicolon
\[dq]\&;\[dq] (that isn't inside a string) is a comment. There is another
format: anything that follows a \[dq]*\[dq] that is placed right at the start of
a line is a comment.
.Ss Sections
Before you can start writing code, you must define a section.
This tells the assembler what kind of information follows and, if it is code,