You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gn...@apache.org on 2020/03/14 14:38:48 UTC
[incubator-nuttx] branch master updated: Added assembly header
detection.
This is an automated email from the ASF dual-hosted git repository.
gnutt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new cdf6158 Added assembly header detection.
cdf6158 is described below
commit cdf615855ac3bd0f3283dc87a414e4d8cb6f49e9
Author: Johanne Schock <jo...@nivus.com>
AuthorDate: Sat Mar 14 14:36:47 2020 +0100
Added assembly header detection.
---
tools/nxstyle.c | 495 +++++++++++++++++++++++++++++++++-----------------------
1 file changed, 292 insertions(+), 203 deletions(-)
diff --git a/tools/nxstyle.c b/tools/nxstyle.c
index da536f8..bcd7d6d 100644
--- a/tools/nxstyle.c
+++ b/tools/nxstyle.c
@@ -116,6 +116,10 @@ enum pptype_e
{
PPLINE_NONE = 0,
PPLINE_DEFINE,
+ PPLINE_IF,
+ PPLINE_ELIF,
+ PPLINE_ELSE,
+ PPLINE_ENDIF,
PPLINE_OTHER
};
@@ -526,6 +530,8 @@ int main(int argc, char **argv, char **envp)
int dnest; /* Data declaration nesting level on this line */
int prevdnest; /* Data declaration nesting level on the previous line */
int pnest; /* Parenthesis nesting level on this line */
+ int ppifnest; /* #if nesting level on this line */
+ int inasm; /* > 0: Within #ifdef __ASSEMBLY__ */
int comment_lineno; /* Line on which the last comment was closed */
int blank_lineno; /* Line number of the last blank line */
int noblank_lineno; /* A blank line is not needed after this line */
@@ -643,6 +649,8 @@ int main(int argc, char **argv, char **envp)
bnest = 0; /* Brace nesting level on this line */
dnest = 0; /* Data declaration nesting level on this line */
pnest = 0; /* Parenthesis nesting level on this line */
+ ppifnest = 0; /* #if nesting level on this line */
+ inasm = 0; /* > 0: Within #ifdef __ASSEMBLY__ */
comment_lineno = -1; /* Line on which the last comment was closed */
blank_lineno = -1; /* Line number of the last blank line */
noblank_lineno = -1; /* A blank line is not needed after this line */
@@ -851,71 +859,147 @@ int main(int argc, char **argv, char **envp)
* line.
*/
+ ii = indent + 1;
+
if (ppline == PPLINE_NONE)
{
/* Skip to the pre-processor command following the '#' */
- for (ii = indent + 1;
- line[ii] != '\0' && isspace(line[ii]);
- ii++)
- {
- }
+ while (line[ii] != '\0' && isspace(line[ii]))
+ {
+ ii++;
+ }
- if (line[ii] != '\0')
- {
- /* Make sure that pre-processor definitions are all in
- * the pre-processor definitions section.
- */
+ if (line[ii] != '\0')
+ {
+ /* Make sure that pre-processor definitions are all in
+ * the pre-processor definitions section.
+ */
- ppline = PPLINE_OTHER;
+ ppline = PPLINE_OTHER;
- if (strncmp(&line[ii], "define", 6) == 0)
- {
- ppline = PPLINE_DEFINE;
+ if (strncmp(&line[ii], "define", 6) == 0)
+ {
+ ppline = PPLINE_DEFINE;
- if (g_section != PRE_PROCESSOR_DEFINITIONS)
- {
- /* A complication is the header files always have
- * the idempotence guard definitions before the
- * "Pre-processor Definitions section".
- */
+ if (g_section != PRE_PROCESSOR_DEFINITIONS)
+ {
+ /* A complication is the header files always have
+ * the idempotence guard definitions before the
+ * "Pre-processor Definitions section".
+ */
- if (g_section == NO_SECTION &&
- g_file_type != C_HEADER)
- {
- /* Only a warning because there is some usage
- * of define outside the Pre-processor
- * Definitions section which is justifiable.
- * Should be manually checked.
- */
-
- WARN("#define outside of 'Pre-processor "
- "Definitions' section",
- lineno, ii);
- }
- }
- }
+ if (g_section == NO_SECTION &&
+ g_file_type != C_HEADER)
+ {
+ /* Only a warning because there is some usage
+ * of define outside the Pre-processor
+ * Definitions section which is justifiable.
+ * Should be manually checked.
+ */
+
+ WARN("#define outside of 'Pre-processor "
+ "Definitions' section",
+ lineno, ii);
+ }
+ }
+ }
- /* Make sure that files are included only in the Included
- * Files section.
- */
+ /* Make sure that files are included only in the Included
+ * Files section.
+ */
- else if (strncmp(&line[ii], "include", 7) == 0)
- {
- if (g_section != INCLUDED_FILES)
- {
- /* Only a warning because there is some usage of
- * include outside the Included Files section
- * which may be is justifiable. Should be
- * manually checked.
- */
-
- WARN("#include outside of 'Included Files' "
- "section",
- lineno, ii);
- }
- }
- }
+ else if (strncmp(&line[ii], "include", 7) == 0)
+ {
+ if (g_section != INCLUDED_FILES)
+ {
+ /* Only a warning because there is some usage of
+ * include outside the Included Files section
+ * which may be is justifiable. Should be
+ * manually checked.
+ */
+
+ WARN("#include outside of 'Included Files' "
+ "section",
+ lineno, ii);
+ }
+ }
+ else if (strncmp(&line[ii], "if", 2) == 0)
+ {
+ ppifnest++;
+
+ ppline = PPLINE_IF;
+ ii += 2;
+ }
+ else if (strncmp(&line[ii], "elif", 4) == 0)
+ {
+ if (ppifnest == inasm)
+ {
+ inasm = 0;
+ }
+
+ ppline = PPLINE_ELIF;
+ ii += 4;
+ }
+ else if (strncmp(&line[ii], "else", 4) == 0)
+ {
+ if (ppifnest == inasm)
+ {
+ inasm = 0;
+ }
+
+ ppline = PPLINE_ELSE;
+ }
+ else if (strncmp(&line[ii], "endif", 4) == 0)
+ {
+ if (ppifnest == inasm)
+ {
+ inasm = 0;
+ }
+
+ ppifnest--;
+
+ ppline = PPLINE_ENDIF;
+ }
+ }
+ }
+
+ if (ppline == PPLINE_IF || ppline == PPLINE_ELIF)
+ {
+ int bdef = 0;
+
+ if (strncmp(&line[ii], "def", 3) == 0)
+ {
+ bdef = 1;
+ ii += 3;
+ }
+ else
+ {
+ while (line[ii] != '\0' && isspace(line[ii]))
+ {
+ ii++;
+ }
+
+ if (strncmp(&line[ii], "defined", 7) == 0)
+ {
+ bdef = 1;
+ ii += 7;
+ }
+ }
+
+ if (bdef)
+ {
+ while (line[ii] != '\0' &&
+ (isspace(line[ii]) || line[ii] == '('))
+ {
+ ii++;
+ }
+
+ if (strncmp(&line[ii], "__ASSEMBLY__", 12) == 0)
+ {
+ inasm = ppifnest;
+ }
+ }
}
/* Check if the next line will be a continuation of the pre-
@@ -968,10 +1052,12 @@ int main(int argc, char **argv, char **envp)
rhcomment = -1;
- if (ncomment > 0 && (strncmp(&line[ii], "if", 2) == 0 ||
- strncmp(&line[ii], "el", 2) == 0))
+ if (ncomment > 0 &&
+ (ppline == PPLINE_IF ||
+ ppline == PPLINE_ELSE ||
+ ppline == PPLINE_ELIF))
{
- /* in #if... and #el.. */
+ /* in #if... and #el... */
ERROR("No multiline comment right of code allowed here",
lineno, n);
@@ -1047,175 +1133,178 @@ int main(int argc, char **argv, char **envp)
* example.
*/
- else if (strncmp(&line[indent], "auto ", 5) == 0 ||
- strncmp(&line[indent], "bool ", 5) == 0 ||
- strncmp(&line[indent], "char ", 5) == 0 ||
- strncmp(&line[indent], "CODE ", 5) == 0 ||
- strncmp(&line[indent], "const ", 6) == 0 ||
- strncmp(&line[indent], "double ", 7) == 0 ||
- strncmp(&line[indent], "struct ", 7) == 0 ||
- strncmp(&line[indent], "struct\n", 7) == 0 || /* May be unnamed */
- strncmp(&line[indent], "enum ", 5) == 0 ||
- strncmp(&line[indent], "extern ", 7) == 0 ||
- strncmp(&line[indent], "EXTERN ", 7) == 0 ||
- strncmp(&line[indent], "FAR ", 4) == 0 ||
- strncmp(&line[indent], "float ", 6) == 0 ||
- strncmp(&line[indent], "int ", 4) == 0 ||
- strncmp(&line[indent], "int16_t ", 8) == 0 ||
- strncmp(&line[indent], "int32_t ", 8) == 0 ||
- strncmp(&line[indent], "long ", 5) == 0 ||
- strncmp(&line[indent], "off_t ", 6) == 0 ||
- strncmp(&line[indent], "register ", 9) == 0 ||
- strncmp(&line[indent], "short ", 6) == 0 ||
- strncmp(&line[indent], "signed ", 7) == 0 ||
- strncmp(&line[indent], "size_t ", 7) == 0 ||
- strncmp(&line[indent], "ssize_t ", 8) == 0 ||
- strncmp(&line[indent], "static ", 7) == 0 ||
- strncmp(&line[indent], "time_t ", 7) == 0 ||
- strncmp(&line[indent], "typedef ", 8) == 0 ||
- strncmp(&line[indent], "uint8_t ", 8) == 0 ||
- strncmp(&line[indent], "uint16_t ", 9) == 0 ||
- strncmp(&line[indent], "uint32_t ", 9) == 0 ||
- strncmp(&line[indent], "union ", 6) == 0 ||
- strncmp(&line[indent], "union\n", 6) == 0 || /* May be unnamed */
- strncmp(&line[indent], "unsigned ", 9) == 0 ||
- strncmp(&line[indent], "void ", 5) == 0 ||
- strncmp(&line[indent], "volatile ", 9) == 0)
+ else if (inasm == 0)
{
- /* Check if this is extern "C"; We don't typically indent following
- * this.
- */
-
- if (strncmp(&line[indent], "extern \"C\"", 10) == 0)
+ if (strncmp(&line[indent], "auto ", 5) == 0 ||
+ strncmp(&line[indent], "bool ", 5) == 0 ||
+ strncmp(&line[indent], "char ", 5) == 0 ||
+ strncmp(&line[indent], "CODE ", 5) == 0 ||
+ strncmp(&line[indent], "const ", 6) == 0 ||
+ strncmp(&line[indent], "double ", 7) == 0 ||
+ strncmp(&line[indent], "struct ", 7) == 0 ||
+ strncmp(&line[indent], "struct\n", 7) == 0 || /* May be unnamed */
+ strncmp(&line[indent], "enum ", 5) == 0 ||
+ strncmp(&line[indent], "extern ", 7) == 0 ||
+ strncmp(&line[indent], "EXTERN ", 7) == 0 ||
+ strncmp(&line[indent], "FAR ", 4) == 0 ||
+ strncmp(&line[indent], "float ", 6) == 0 ||
+ strncmp(&line[indent], "int ", 4) == 0 ||
+ strncmp(&line[indent], "int16_t ", 8) == 0 ||
+ strncmp(&line[indent], "int32_t ", 8) == 0 ||
+ strncmp(&line[indent], "long ", 5) == 0 ||
+ strncmp(&line[indent], "off_t ", 6) == 0 ||
+ strncmp(&line[indent], "register ", 9) == 0 ||
+ strncmp(&line[indent], "short ", 6) == 0 ||
+ strncmp(&line[indent], "signed ", 7) == 0 ||
+ strncmp(&line[indent], "size_t ", 7) == 0 ||
+ strncmp(&line[indent], "ssize_t ", 8) == 0 ||
+ strncmp(&line[indent], "static ", 7) == 0 ||
+ strncmp(&line[indent], "time_t ", 7) == 0 ||
+ strncmp(&line[indent], "typedef ", 8) == 0 ||
+ strncmp(&line[indent], "uint8_t ", 8) == 0 ||
+ strncmp(&line[indent], "uint16_t ", 9) == 0 ||
+ strncmp(&line[indent], "uint32_t ", 9) == 0 ||
+ strncmp(&line[indent], "union ", 6) == 0 ||
+ strncmp(&line[indent], "union\n", 6) == 0 || /* May be unnamed */
+ strncmp(&line[indent], "unsigned ", 9) == 0 ||
+ strncmp(&line[indent], "void ", 5) == 0 ||
+ strncmp(&line[indent], "volatile ", 9) == 0)
{
- externc_lineno = lineno;
- }
-
- /* bfunctions: True: Processing private or public functions.
- * bnest: Brace nesting level on this line
- * dnest: Data declaration nesting level on this line
- */
+ /* Check if this is extern "C"; We don't typically indent
+ * following this.
+ */
- /* REVISIT: Also picks up function return types */
+ if (strncmp(&line[indent], "extern \"C\"", 10) == 0)
+ {
+ externc_lineno = lineno;
+ }
- /* REVISIT: Logic problem for nested data/function declarations */
+ /* bfunctions: True: Processing private or public functions.
+ * bnest: Brace nesting level on this line
+ * dnest: Data declaration nesting level on this line
+ */
- if ((!bfunctions || bnest > 0) && dnest == 0)
- {
- dnest = 1;
- }
+ /* REVISIT: Also picks up function return types */
- /* Check for multiple definitions of variables on the line.
- * Ignores declarations within parentheses which are probably
- * formal parameters.
- */
+ /* REVISIT: Logic problem for nested data/function declarations */
- if (pnest == 0)
- {
- int tmppnest;
+ if ((!bfunctions || bnest > 0) && dnest == 0)
+ {
+ dnest = 1;
+ }
- /* Note, we have not yet parsed each character on the line so
- * a comma have have been be preceded by '(' on the same line.
- * We will have parse up to any comma to see if that is the
- * case.
+ /* Check for multiple definitions of variables on the line.
+ * Ignores declarations within parentheses which are probably
+ * formal parameters.
*/
- for (i = indent, tmppnest = 0;
- line[i] != '\n' && line[i] != '\0';
- i++)
+ if (pnest == 0)
{
- if (tmppnest == 0 && line[i] == ',')
- {
- ERROR("Multiple data definitions", lineno, i + 1);
- break;
- }
- else if (line[i] == '(')
- {
- tmppnest++;
- }
- else if (line[i] == ')')
+ int tmppnest;
+
+ /* Note, we have not yet parsed each character on the line so
+ * a comma have have been be preceded by '(' on the same line.
+ * We will have parse up to any comma to see if that is the
+ * case.
+ */
+
+ for (i = indent, tmppnest = 0;
+ line[i] != '\n' && line[i] != '\0';
+ i++)
{
- if (tmppnest < 1)
+ if (tmppnest == 0 && line[i] == ',')
{
- /* We should catch this later */
-
+ ERROR("Multiple data definitions", lineno, i + 1);
break;
}
+ else if (line[i] == '(')
+ {
+ tmppnest++;
+ }
+ else if (line[i] == ')')
+ {
+ if (tmppnest < 1)
+ {
+ /* We should catch this later */
- tmppnest--;
- }
- else if (line[i] == ';')
- {
- /* Break out if the semicolon terminates the
- * declaration is found. Avoids processing any
- * righthand comments in most cases.
- */
+ break;
+ }
- break;
+ tmppnest--;
+ }
+ else if (line[i] == ';')
+ {
+ /* Break out if the semicolon terminates the
+ * declaration is found. Avoids processing any
+ * righthand comments in most cases.
+ */
+
+ break;
+ }
}
}
}
- }
- /* Check for a keyword indicating the beginning of a statement.
- * REVISIT: This, obviously, will not detect statements that do not
- * begin with a C keyword (such as assignment statements).
- */
-
- else if (strncmp(&line[indent], "break ", 6) == 0 ||
- strncmp(&line[indent], "case ", 5) == 0 ||
-#if 0 /* Part of switch */
- strncmp(&line[indent], "case ", 5) == 0 ||
-#endif
- strncmp(&line[indent], "continue ", 9) == 0 ||
+ /* Check for a keyword indicating the beginning of a statement.
+ * REVISIT: This, obviously, will not detect statements that do not
+ * begin with a C keyword (such as assignment statements).
+ */
-#if 0 /* Part of switch */
- strncmp(&line[indent], "default ", 8) == 0 ||
-#endif
- strncmp(&line[indent], "do ", 3) == 0 ||
- strncmp(&line[indent], "else ", 5) == 0 ||
- strncmp(&line[indent], "goto ", 5) == 0 ||
- strncmp(&line[indent], "if ", 3) == 0 ||
- strncmp(&line[indent], "return ", 7) == 0 ||
-#if 0 /* Doesn't follow pattern */
- strncmp(&line[indent], "switch ", 7) == 0 ||
-#endif
- strncmp(&line[indent], "while ", 6) == 0)
- {
- bstatm = true;
- }
+ else if (strncmp(&line[indent], "break ", 6) == 0 ||
+ strncmp(&line[indent], "case ", 5) == 0 ||
+ #if 0 /* Part of switch */
+ strncmp(&line[indent], "case ", 5) == 0 ||
+ #endif
+ strncmp(&line[indent], "continue ", 9) == 0 ||
+
+ #if 0 /* Part of switch */
+ strncmp(&line[indent], "default ", 8) == 0 ||
+ #endif
+ strncmp(&line[indent], "do ", 3) == 0 ||
+ strncmp(&line[indent], "else ", 5) == 0 ||
+ strncmp(&line[indent], "goto ", 5) == 0 ||
+ strncmp(&line[indent], "if ", 3) == 0 ||
+ strncmp(&line[indent], "return ", 7) == 0 ||
+ #if 0 /* Doesn't follow pattern */
+ strncmp(&line[indent], "switch ", 7) == 0 ||
+ #endif
+ strncmp(&line[indent], "while ", 6) == 0)
+ {
+ bstatm = true;
+ }
- /* Spacing works a little differently for and switch statements */
+ /* Spacing works a little differently for and switch statements */
- else if (strncmp(&line[indent], "for ", 4) == 0)
- {
- bfor = true;
- bstatm = true;
- }
- else if (strncmp(&line[indent], "switch ", 7) == 0)
- {
- bswitch = true;
- }
+ else if (strncmp(&line[indent], "for ", 4) == 0)
+ {
+ bfor = true;
+ bstatm = true;
+ }
+ else if (strncmp(&line[indent], "switch ", 7) == 0)
+ {
+ bswitch = true;
+ }
- /* Also check for C keywords with missing white space */
+ /* Also check for C keywords with missing white space */
- else if (strncmp(&line[indent], "do(", 3) == 0 ||
- strncmp(&line[indent], "if(", 3) == 0 ||
- strncmp(&line[indent], "while(", 6) == 0)
- {
- ERROR("Missing whitespace after keyword", lineno, n);
- bstatm = true;
- }
- else if (strncmp(&line[indent], "for(", 4) == 0)
- {
- ERROR("Missing whitespace after keyword", lineno, n);
- bfor = true;
- bstatm = true;
- }
- else if (strncmp(&line[indent], "switch(", 7) == 0)
- {
- ERROR("Missing whitespace after keyword", lineno, n);
- bswitch = true;
+ else if (strncmp(&line[indent], "do(", 3) == 0 ||
+ strncmp(&line[indent], "if(", 3) == 0 ||
+ strncmp(&line[indent], "while(", 6) == 0)
+ {
+ ERROR("Missing whitespace after keyword", lineno, n);
+ bstatm = true;
+ }
+ else if (strncmp(&line[indent], "for(", 4) == 0)
+ {
+ ERROR("Missing whitespace after keyword", lineno, n);
+ bfor = true;
+ bstatm = true;
+ }
+ else if (strncmp(&line[indent], "switch(", 7) == 0)
+ {
+ ERROR("Missing whitespace after keyword", lineno, n);
+ bswitch = true;
+ }
}
/* STEP 3: Parse each character on the line */
@@ -1590,14 +1679,14 @@ int main(int argc, char **argv, char **envp)
bquote = false;
}
- /* The reset of the line is only examined of we are not in a comment
- * or a string.
+ /* The rest of the line is only examined of we are not in a comment,
+ * in a string or in assembly.
*
* REVISIT: Should still check for whitespace at the end of the
* line.
*/
- if (ncomment == 0 && !bstring)
+ if (ncomment == 0 && !bstring && inasm == 0)
{
switch (line[n])
{