mirror of
https://github.com/apache/nuttx.git
synced 2025-01-13 13:18:50 +08:00
tools/nxstyle.c: Beef up logic that detects multiple variable definitions per line.
This commit is contained in:
parent
af75330012
commit
bc5908d9fd
4 changed files with 149 additions and 47 deletions
|
@ -24,6 +24,16 @@ Status
|
||||||
2019-02-12: A little progress. I do make it all the way into NSH, but
|
2019-02-12: A little progress. I do make it all the way into NSH, but
|
||||||
with no console input.
|
with no console input.
|
||||||
2019-02-13: NSH is now fully functional.
|
2019-02-13: NSH is now fully functional.
|
||||||
|
2019-02-17: My plan was to include develop an IEEE 802.15.4 driver
|
||||||
|
using the interface code for the Cortex-M0 co-processor. Unfortunately,
|
||||||
|
that interface code is a part of the TI153STACK. The source for that
|
||||||
|
stack is included in the SDK. However, it looks like the licensing on
|
||||||
|
that code will prevent that (it is not BSD compatible). That is a shame;
|
||||||
|
I only want the Cortex-M0 interface, not TI's stack (NuttX has its own
|
||||||
|
IEEE 802.15.4 stack).
|
||||||
|
|
||||||
|
NOTE: This does not prevent you as an end-user from using the TI154STACK;
|
||||||
|
it only prevents me from re-distributing any part of it.
|
||||||
|
|
||||||
Serial Console
|
Serial Console
|
||||||
==============
|
==============
|
||||||
|
|
|
@ -128,6 +128,16 @@ typedef struct bigint_s bigint_t;
|
||||||
* Private Data
|
* Private Data
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* REVISIT: __dtoa is not thread safe due to thse two global variables.
|
||||||
|
* Options:
|
||||||
|
*
|
||||||
|
* 1. Allocate on stack. g_freelist is rather large, however.. around 275
|
||||||
|
* bytes (it could be shrunk a little by using stdint types instead of int.
|
||||||
|
* 2. Semaphore protect the global variables and handle interrupt level
|
||||||
|
* calls as a special case (perhaps refusing them? Or having a duplicate
|
||||||
|
* set of variables, one for tasks and one for interrupt usage)
|
||||||
|
*/
|
||||||
|
|
||||||
static FAR bigint_t *g_freelist[KMAX + 1];
|
static FAR bigint_t *g_freelist[KMAX + 1];
|
||||||
static FAR bigint_t *g_p5s;
|
static FAR bigint_t *g_p5s;
|
||||||
|
|
||||||
|
|
|
@ -498,11 +498,13 @@ void nx_start(void)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
g_idletcb[cpu].cmn.flags = (TCB_FLAG_TTYPE_KERNEL | TCB_FLAG_NONCANCELABLE |
|
g_idletcb[cpu].cmn.flags = (TCB_FLAG_TTYPE_KERNEL |
|
||||||
|
TCB_FLAG_NONCANCELABLE |
|
||||||
TCB_FLAG_CPU_LOCKED);
|
TCB_FLAG_CPU_LOCKED);
|
||||||
g_idletcb[cpu].cmn.cpu = cpu;
|
g_idletcb[cpu].cmn.cpu = cpu;
|
||||||
#else
|
#else
|
||||||
g_idletcb[cpu].cmn.flags = (TCB_FLAG_TTYPE_KERNEL | TCB_FLAG_NONCANCELABLE);
|
g_idletcb[cpu].cmn.flags = (TCB_FLAG_TTYPE_KERNEL |
|
||||||
|
TCB_FLAG_NONCANCELABLE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
@ -521,7 +523,8 @@ void nx_start(void)
|
||||||
/* Set the IDLE task name */
|
/* Set the IDLE task name */
|
||||||
|
|
||||||
# ifdef CONFIG_SMP
|
# ifdef CONFIG_SMP
|
||||||
snprintf(g_idletcb[cpu].cmn.name, CONFIG_TASK_NAME_SIZE, "CPU%d IDLE", cpu);
|
snprintf(g_idletcb[cpu].cmn.name, CONFIG_TASK_NAME_SIZE, "CPU%d IDLE",
|
||||||
|
cpu);
|
||||||
# else
|
# else
|
||||||
strncpy(g_idletcb[cpu].cmn.name, g_idlename, CONFIG_TASK_NAME_SIZE);
|
strncpy(g_idletcb[cpu].cmn.name, g_idlename, CONFIG_TASK_NAME_SIZE);
|
||||||
g_idletcb[cpu].cmn.name[CONFIG_TASK_NAME_SIZE] = '\0';
|
g_idletcb[cpu].cmn.name[CONFIG_TASK_NAME_SIZE] = '\0';
|
||||||
|
|
167
tools/nxstyle.c
167
tools/nxstyle.c
|
@ -79,14 +79,16 @@ int main(int argc, char **argv, char **envp)
|
||||||
bool bstring; /* True: Within a string */
|
bool bstring; /* True: Within a string */
|
||||||
bool bquote; /* True: Backslash quoted character next */
|
bool bquote; /* True: Backslash quoted character next */
|
||||||
bool bblank; /* Used to verify block comment termintor */
|
bool bblank; /* Used to verify block comment termintor */
|
||||||
|
bool ppline; /* True: The next line the continuation of a precessor command */
|
||||||
int lineno; /* Current line number */
|
int lineno; /* Current line number */
|
||||||
int indent; /* Indentation level */
|
int indent; /* Indentation level */
|
||||||
int ncomment; /* Comment nesting level on this line */
|
int ncomment; /* Comment nesting level on this line */
|
||||||
int prevncomment; /* Comment nesting level on the previous line */
|
int prevncomment; /* Comment nesting level on the previous line */
|
||||||
int nnest; /* Brace nesting level on this line */
|
int bnest; /* Brace nesting level on this line */
|
||||||
int prevnest; /* Brace nesting level on the previous line */
|
int prevbnest; /* Brace nesting level on the previous line */
|
||||||
int declnest; /* Data declaration nesting level on this line */
|
int dnest; /* Data declaration nesting level on this line */
|
||||||
int prevdeclnest; /* Data declaration nesting level on the previous line */
|
int prevdnest; /* Data declaration nesting level on the previous line */
|
||||||
|
int pnest; /* Parenthesis nesting level on this line */
|
||||||
int comment_lineno; /* Line on which the last one line comment was closed */
|
int comment_lineno; /* Line on which the last one line comment was closed */
|
||||||
int blank_lineno; /* Line number of the last blank line */
|
int blank_lineno; /* Line number of the last blank line */
|
||||||
int noblank_lineno; /* A blank line is not needed after this line */
|
int noblank_lineno; /* A blank line is not needed after this line */
|
||||||
|
@ -143,10 +145,12 @@ int main(int argc, char **argv, char **envp)
|
||||||
bfunctions = false; /* True: In private or public functions */
|
bfunctions = false; /* True: In private or public functions */
|
||||||
bswitch = false; /* True: Within a switch statement */
|
bswitch = false; /* True: Within a switch statement */
|
||||||
bstring = false; /* True: Within a string */
|
bstring = false; /* True: Within a string */
|
||||||
|
ppline = false; /* True: Continuation of a pre-processor line */
|
||||||
lineno = 0; /* Current line number */
|
lineno = 0; /* Current line number */
|
||||||
ncomment = 0; /* Comment nesting level on this line */
|
ncomment = 0; /* Comment nesting level on this line */
|
||||||
nnest = 0; /* Brace nesting level on this line */
|
bnest = 0; /* Brace nesting level on this line */
|
||||||
declnest = 0; /* Data declaration nesting level on this line */
|
dnest = 0; /* Data declaration nesting level on this line */
|
||||||
|
pnest = 0; /* Parenthesis nesting level on this line */
|
||||||
comment_lineno = -1; /* Line on which the last one line comment was closed */
|
comment_lineno = -1; /* Line on which the last one line comment was closed */
|
||||||
blank_lineno = -1; /* Line number of the last blank line */
|
blank_lineno = -1; /* Line number of the last blank line */
|
||||||
noblank_lineno = -1; /* A blank line is not needed after this line */
|
noblank_lineno = -1; /* A blank line is not needed after this line */
|
||||||
|
@ -155,8 +159,8 @@ int main(int argc, char **argv, char **envp)
|
||||||
{
|
{
|
||||||
lineno++;
|
lineno++;
|
||||||
indent = 0;
|
indent = 0;
|
||||||
prevnest = nnest; /* Brace nesting level on the previous line */
|
prevbnest = bnest; /* Brace nesting level on the previous line */
|
||||||
prevdeclnest = declnest; /* Data declaration nesting level on the previous line */
|
prevdnest = dnest; /* Data declaration nesting level on the previous line */
|
||||||
prevncomment = ncomment; /* Comment nesting level on the previous line */
|
prevncomment = ncomment; /* Comment nesting level on the previous line */
|
||||||
bstatm = false; /* True: This line is beginning of a statement */
|
bstatm = false; /* True: This line is beginning of a statement */
|
||||||
bfor = false; /* REVISIT: Implies for() is all on one line */
|
bfor = false; /* REVISIT: Implies for() is all on one line */
|
||||||
|
@ -259,13 +263,29 @@ int main(int argc, char **argv, char **envp)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* STEP 2: Detect some certain start of line conditions */
|
/* STEP 2: Detect some certain start of line conditions */
|
||||||
/* Skip over pre-processor lines */
|
/* Skip over pre-processor lines (or continuations of pre-processor
|
||||||
|
* lines as indicated by ppline)
|
||||||
|
*/
|
||||||
|
|
||||||
if (line[indent] == '#')
|
if (line[indent] == '#' || ppline)
|
||||||
{
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
/* Suppress error for comment following conditional compilation */
|
/* Suppress error for comment following conditional compilation */
|
||||||
|
|
||||||
noblank_lineno = lineno;
|
noblank_lineno = lineno;
|
||||||
|
|
||||||
|
/* Check if the next line will be a continuation of the pre-
|
||||||
|
* processor command.
|
||||||
|
*/
|
||||||
|
|
||||||
|
len = strlen(&line[indent]) + indent - 1;
|
||||||
|
if (line[len] == '\n')
|
||||||
|
{
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
ppline = (line[len] == '\\');
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,22 +371,62 @@ int main(int argc, char **argv, char **envp)
|
||||||
/* REVISIT: Also picks up function return types */
|
/* REVISIT: Also picks up function return types */
|
||||||
/* REVISIT: Logic problem for nested data/function declarations */
|
/* REVISIT: Logic problem for nested data/function declarations */
|
||||||
|
|
||||||
if ((!bfunctions || nnest > 0) && declnest == 0)
|
if ((!bfunctions || bnest > 0) && dnest == 0)
|
||||||
{
|
{
|
||||||
declnest = 1;
|
dnest = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for multiple definitions of local variables on the line.
|
/* Check for multiple definitions of variables on the line.
|
||||||
* NOTE: Will miss multiple global variable definitions on a line,
|
* Ignores declarations within parentheses which are probably
|
||||||
* but this is because the heuristic is not smart enough to
|
* formal parameters.
|
||||||
* distingush a global variable from a function prototype.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (indent > 0 && strchr(&line[indent], ',') != NULL)
|
if (pnest == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
int tmppnest;
|
||||||
"Multiple data definitions on line %d\n",
|
|
||||||
lineno);
|
/* 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 == 0 && line[i] == ',')
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"Multiple data definitions on line %d\n",
|
||||||
|
lineno);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (line[i] == '(')
|
||||||
|
{
|
||||||
|
tmppnest++;
|
||||||
|
}
|
||||||
|
else if (line[i] == ')')
|
||||||
|
{
|
||||||
|
if (tmppnest < 1)
|
||||||
|
{
|
||||||
|
/* We should catch this later */
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -592,7 +652,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
{
|
{
|
||||||
if (n > indent)
|
if (n > indent)
|
||||||
{
|
{
|
||||||
if (declnest == 0)
|
if (dnest == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Left bracket not on separate line at %d:%d\n",
|
"Left bracket not on separate line at %d:%d\n",
|
||||||
|
@ -601,7 +661,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
}
|
}
|
||||||
else if (line[n + 1] != '\n')
|
else if (line[n + 1] != '\n')
|
||||||
{
|
{
|
||||||
if (declnest == 0)
|
if (dnest == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Garbage follows left bracket at line %d:%d\n",
|
"Garbage follows left bracket at line %d:%d\n",
|
||||||
|
@ -609,10 +669,10 @@ int main(int argc, char **argv, char **envp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nnest++;
|
bnest++;
|
||||||
if (declnest > 0)
|
if (dnest > 0)
|
||||||
{
|
{
|
||||||
declnest++;
|
dnest++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Suppress error for comment following a left brace */
|
/* Suppress error for comment following a left brace */
|
||||||
|
@ -623,32 +683,32 @@ int main(int argc, char **argv, char **envp)
|
||||||
|
|
||||||
case '}':
|
case '}':
|
||||||
{
|
{
|
||||||
if (nnest < 1)
|
if (bnest < 1)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Unmatched right brace at line %d:%d\n", lineno, n);
|
fprintf(stderr, "Unmatched right brace at line %d:%d\n", lineno, n);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nnest--;
|
bnest--;
|
||||||
if (nnest < 1)
|
if (bnest < 1)
|
||||||
{
|
{
|
||||||
nnest = 0;
|
bnest = 0;
|
||||||
bswitch = false;
|
bswitch = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (declnest < 3)
|
if (dnest < 3)
|
||||||
{
|
{
|
||||||
declnest = 0;
|
dnest = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
declnest--;
|
dnest--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n > indent)
|
if (n > indent)
|
||||||
{
|
{
|
||||||
if (declnest == 0)
|
if (dnest == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Right bracket not on separate line at %d:%d\n",
|
"Right bracket not on separate line at %d:%d\n",
|
||||||
|
@ -665,7 +725,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
* structure.
|
* structure.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (prevdeclnest <= 0 || declnest > 0)
|
if (prevdnest <= 0 || dnest > 0)
|
||||||
{
|
{
|
||||||
/* REVISIT: Generates false alarms on named structures
|
/* REVISIT: Generates false alarms on named structures
|
||||||
* that are fields of other structures or unions.
|
* that are fields of other structures or unions.
|
||||||
|
@ -679,10 +739,16 @@ int main(int argc, char **argv, char **envp)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Check for inappropriate space around parentheses */
|
/* Handle logic with parenthese */
|
||||||
|
|
||||||
case '(':
|
case '(':
|
||||||
{
|
{
|
||||||
|
/* Increase the parenthetical nesting level */
|
||||||
|
|
||||||
|
pnest++;
|
||||||
|
|
||||||
|
/* Check for inappropriate space around parentheses */
|
||||||
|
|
||||||
if (line[n + 1] == ' ' /* && !bfor */)
|
if (line[n + 1] == ' ' /* && !bfor */)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
@ -694,6 +760,19 @@ int main(int argc, char **argv, char **envp)
|
||||||
|
|
||||||
case ')':
|
case ')':
|
||||||
{
|
{
|
||||||
|
/* Decrease the parenthetical nesting level */
|
||||||
|
|
||||||
|
if (pnest < 1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Unmatched right parentheses at line %d:%d\n",
|
||||||
|
lineno, n);
|
||||||
|
pnest = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pnest--;
|
||||||
|
}
|
||||||
|
|
||||||
/* Allow ')' as first thing on the line (n == indent)
|
/* Allow ')' as first thing on the line (n == indent)
|
||||||
* Allow "for (xx; xx; )" (bfor == true)
|
* Allow "for (xx; xx; )" (bfor == true)
|
||||||
*/
|
*/
|
||||||
|
@ -742,12 +821,12 @@ int main(int argc, char **argv, char **envp)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Semicolon terminates a declaration/definition if there
|
/* Semicolon terminates a declaration/definition if there
|
||||||
* was no left curly brace (i.e., declnest is only 1).
|
* was no left curly brace (i.e., dnest is only 1).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (declnest == 1)
|
if (dnest == 1)
|
||||||
{
|
{
|
||||||
declnest = 0;
|
dnest = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1050,7 +1129,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
}
|
}
|
||||||
else if (indent > 0 && indent < 2)
|
else if (indent > 0 && indent < 2)
|
||||||
{
|
{
|
||||||
if (nnest > 0)
|
if (bnest > 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Insufficient indentation line %d:%d\n",
|
fprintf(stderr, "Insufficient indentation line %d:%d\n",
|
||||||
lineno, indent);
|
lineno, indent);
|
||||||
|
@ -1091,7 +1170,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
* comments before beginning of function definitions.
|
* comments before beginning of function definitions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ((indent & 3) != 3 && bfunctions && declnest == 0)
|
if ((indent & 3) != 3 && bfunctions && dnest == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Bad comment block alignment at line %d:%d\n",
|
"Bad comment block alignment at line %d:%d\n",
|
||||||
|
@ -1128,7 +1207,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
{
|
{
|
||||||
/* Ignore if we are at global scope */
|
/* Ignore if we are at global scope */
|
||||||
|
|
||||||
if (prevnest > 0)
|
if (prevbnest > 0)
|
||||||
{
|
{
|
||||||
bool blabel = false;
|
bool blabel = false;
|
||||||
|
|
||||||
|
@ -1163,7 +1242,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
{
|
{
|
||||||
/* REVISIT: False alarms in data initializers and switch statements */
|
/* REVISIT: False alarms in data initializers and switch statements */
|
||||||
|
|
||||||
if ((indent & 3) != 0 && !bswitch && declnest == 0)
|
if ((indent & 3) != 0 && !bswitch && dnest == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Bad left brace alignment at line %d:%d\n",
|
fprintf(stderr, "Bad left brace alignment at line %d:%d\n",
|
||||||
lineno, indent);
|
lineno, indent);
|
||||||
|
@ -1173,7 +1252,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
{
|
{
|
||||||
/* REVISIT: False alarms in data initializers and switch statements */
|
/* REVISIT: False alarms in data initializers and switch statements */
|
||||||
|
|
||||||
if ((indent & 3) != 0 && !bswitch && prevdeclnest == 0)
|
if ((indent & 3) != 0 && !bswitch && prevdnest == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Bad right brace alignment at line %d:%d\n",
|
fprintf(stderr, "Bad right brace alignment at line %d:%d\n",
|
||||||
lineno, indent);
|
lineno, indent);
|
||||||
|
@ -1195,7 +1274,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
if ((bstatm || /* Begins with C keyword */
|
if ((bstatm || /* Begins with C keyword */
|
||||||
(line[indent] == '/' && bfunctions)) && /* Comment in functions */
|
(line[indent] == '/' && bfunctions)) && /* Comment in functions */
|
||||||
!bswitch && /* Not in a switch */
|
!bswitch && /* Not in a switch */
|
||||||
declnest == 0) /* Not a data definition */
|
dnest == 0) /* Not a data definition */
|
||||||
{
|
{
|
||||||
if ((indent & 3) != 2)
|
if ((indent & 3) != 2)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue