Fix nxstyle to mksyscall.c

This commit is contained in:
Nakamura, Yuuichi 2020-02-13 16:23:02 +09:00 committed by Xiang Xiao
parent bdf871a214
commit d9472bb625

View File

@ -63,11 +63,12 @@ static FILE *g_stubstream;
static bool is_vararg(const char *type, int ndx, int nparms) static bool is_vararg(const char *type, int ndx, int nparms)
{ {
if (strcmp(type,"...") == 0) if (strcmp(type, "...") == 0)
{ {
if (ndx != (nparms-1)) if (ndx != (nparms - 1))
{ {
fprintf(stderr, "%d: ... is not the last in the argument list\n", g_lineno); fprintf(stderr, "%d: ... is not the last in the argument list\n",
g_lineno);
exit(11); exit(11);
} }
else if (nparms < 2) else if (nparms < 2)
@ -84,12 +85,12 @@ static bool is_vararg(const char *type, int ndx, int nparms)
static bool is_union(const char *type) static bool is_union(const char *type)
{ {
return (strncmp(type,"union", 5) == 0); return (strncmp(type, "union", 5) == 0);
} }
static const char *check_funcptr(const char *type) static const char *check_funcptr(const char *type)
{ {
const char *str = strstr(type,"(*)"); const char *str = strstr(type, "(*)");
if (str) if (str)
{ {
return str + 2; return str + 2;
@ -114,7 +115,9 @@ static void print_formalparm(FILE *stream, const char *argtype, int parmno)
const char *part2; const char *part2;
int len; int len;
/* Function pointers and array formal parameter types are a little more work */ /* Function pointers and array formal parameter types are a little more
* work
*/
if ((part2 = check_funcptr(argtype)) != NULL || if ((part2 = check_funcptr(argtype)) != NULL ||
(part2 = check_array(argtype)) != NULL) (part2 = check_array(argtype)) != NULL)
@ -139,12 +142,13 @@ static void get_formalparmtype(const char *arg, char *formal)
{ {
*formal++ = *arg++; *formal++ = *arg++;
} }
*formal = '\0'; *formal = '\0';
} }
static void get_actualparmtype(const char *arg, char *actual) static void get_actualparmtype(const char *arg, char *actual)
{ {
const char *pstart = strchr(arg,'|'); const char *pstart = strchr(arg, '|');
if (pstart) if (pstart)
{ {
/* The actual parameter type starts after the '|' */ /* The actual parameter type starts after the '|' */
@ -168,12 +172,13 @@ static void get_actualparmtype(const char *arg, char *actual)
{ {
*actual++ = *pstart++; *actual++ = *pstart++;
} }
*actual = '\0'; *actual = '\0';
} }
static void get_fieldname(const char *arg, char *fieldname) static void get_fieldname(const char *arg, char *fieldname)
{ {
char *pactual = strchr(arg,'|'); char *pactual = strchr(arg, '|');
char *pstart; char *pstart;
if (pactual) if (pactual)
@ -181,10 +186,12 @@ static void get_fieldname(const char *arg, char *fieldname)
/* The actual parameter type starts after the '|' */ /* The actual parameter type starts after the '|' */
pactual++; pactual++;
pstart = strchr(pactual,'|'); pstart = strchr(pactual, '|');
if (pstart) if (pstart)
{ {
/* The fieldname is everything past the second '|' to the end of the string */ /* The fieldname is everything past the second '|' to the end of
* the string
*/
pstart++; pstart++;
strncpy(fieldname, pstart, MAX_PARMSIZE); strncpy(fieldname, pstart, MAX_PARMSIZE);
@ -198,11 +205,11 @@ static void get_fieldname(const char *arg, char *fieldname)
static FILE *open_proxy(void) static FILE *open_proxy(void)
{ {
char filename[MAX_PARMSIZE+10]; char filename[MAX_PARMSIZE + 10];
FILE *stream; FILE *stream;
snprintf(filename, MAX_PARMSIZE+9, "PROXY_%s.c", g_parm[NAME_INDEX]); snprintf(filename, MAX_PARMSIZE + 9, "PROXY_%s.c", g_parm[NAME_INDEX]);
filename[MAX_PARMSIZE+9] = '\0'; filename[MAX_PARMSIZE + 9] = '\0';
stream = fopen(filename, "w"); stream = fopen(filename, "w");
if (stream == NULL) if (stream == NULL)
@ -210,6 +217,7 @@ static FILE *open_proxy(void)
fprintf(stderr, "Failed to open %s: %s\n", filename, strerror(errno)); fprintf(stderr, "Failed to open %s: %s\n", filename, strerror(errno));
exit(10); exit(10);
} }
return stream; return stream;
} }
@ -225,7 +233,8 @@ static void generate_proxy(int nparms)
/* Generate "up-front" information, include correct header files */ /* Generate "up-front" information, include correct header files */
fprintf(stream, "/* Auto-generated %s proxy file -- do not edit */\n\n", g_parm[NAME_INDEX]); fprintf(stream, "/* Auto-generated %s proxy file -- do not edit */\n\n",
g_parm[NAME_INDEX]);
fprintf(stream, "#include <nuttx/config.h>\n"); fprintf(stream, "#include <nuttx/config.h>\n");
/* Suppress "'noreturn' function does return" warnings. */ /* Suppress "'noreturn' function does return" warnings. */
@ -238,9 +247,9 @@ static void generate_proxy(int nparms)
* final parameter type will be encoded as "..." * final parameter type will be encoded as "..."
*/ */
if (is_vararg(g_parm[PARM1_INDEX+nparms-1], nparms-1, nparms)) if (is_vararg(g_parm[PARM1_INDEX + nparms - 1], nparms - 1, nparms))
{ {
nformal = nparms-1; nformal = nparms - 1;
bvarargs = true; bvarargs = true;
fprintf(stream, "#include <stdarg.h>\n"); fprintf(stream, "#include <stdarg.h>\n");
} }
@ -261,7 +270,9 @@ static void generate_proxy(int nparms)
fprintf(stream, "#if %s\n\n", g_parm[COND_INDEX]); fprintf(stream, "#if %s\n\n", g_parm[COND_INDEX]);
} }
/* Generate the function definition that matches standard function prototype */ /* Generate the function definition that matches standard function
* prototype
*/
fprintf(stream, "%s %s(", g_parm[RETTYPE_INDEX], g_parm[NAME_INDEX]); fprintf(stream, "%s %s(", g_parm[RETTYPE_INDEX], g_parm[NAME_INDEX]);
@ -279,7 +290,7 @@ static void generate_proxy(int nparms)
* formal parameter type. * formal parameter type.
*/ */
get_formalparmtype(g_parm[PARM1_INDEX+i], formal); get_formalparmtype(g_parm[PARM1_INDEX + i], formal);
/* Arguments after the first must be separated from the preceding /* Arguments after the first must be separated from the preceding
* parameter with a comma. * parameter with a comma.
@ -290,7 +301,7 @@ static void generate_proxy(int nparms)
fprintf(stream, ", "); fprintf(stream, ", ");
} }
print_formalparm(stream, formal, i+1); print_formalparm(stream, formal, i + 1);
} }
} }
@ -298,27 +309,30 @@ static void generate_proxy(int nparms)
if (bvarargs) if (bvarargs)
{ {
fprintf(stream, ", ...)\n{\n"); fprintf(stream, ", ...)\n{\n");
/* Get parm variables .. some from the parameter list and others from /* Get parm variables .. some from the parameter list and others from
* the varargs. * the varargs.
*/ */
if (nparms < 7) if (nparms < 7)
{ {
fprintf(stream, " va_list ap;\n"); fprintf(stream, " va_list ap;\n");
for (i = nparms; i < 7; i++)
{
fprintf(stream, " uintptr_t parm%d;\n", i);
}
fprintf(stream, "\n va_start(ap, parm%d);\n", nparms-1); for (i = nparms; i < 7; i++)
for (i = nparms; i < 7; i++) {
{ fprintf(stream, " uintptr_t parm%d;\n", i);
fprintf(stream, " parm%d = va_arg(ap, uintptr_t);\n", i); }
}
fprintf(stream, " va_end(ap);\n\n"); fprintf(stream, "\n va_start(ap, parm%d);\n", nparms - 1);
}
for (i = nparms; i < 7; i++)
{
fprintf(stream, " parm%d = va_arg(ap, uintptr_t);\n", i);
}
fprintf(stream, " va_end(ap);\n\n");
}
} }
else else
{ {
@ -336,7 +350,8 @@ static void generate_proxy(int nparms)
} }
else else
{ {
fprintf(stream, " return (%s)sys_call%d(", g_parm[RETTYPE_INDEX], nactual); fprintf(stream, " return (%s)sys_call%d(", g_parm[RETTYPE_INDEX],
nactual);
} }
/* Create the parameter list with the matching types. The first parameter /* Create the parameter list with the matching types. The first parameter
@ -349,19 +364,19 @@ static void generate_proxy(int nparms)
{ {
/* Is the parameter a union member */ /* Is the parameter a union member */
if (i < nparms && is_union(g_parm[PARM1_INDEX+i])) if (i < nparms && is_union(g_parm[PARM1_INDEX + i]))
{ {
/* Then we will have to pick a field name that can be cast to a /* Then we will have to pick a field name that can be cast to a
* uintptr_t. There probably should be some error handling here * uintptr_t. There probably should be some error handling here
* to catch the case where the fieldname was not supplied. * to catch the case where the fieldname was not supplied.
*/ */
get_fieldname(g_parm[PARM1_INDEX+i], fieldname); get_fieldname(g_parm[PARM1_INDEX + i], fieldname);
fprintf(stream, ", (uintptr_t)parm%d.%s", i+1, fieldname); fprintf(stream, ", (uintptr_t)parm%d.%s", i + 1, fieldname);
} }
else else
{ {
fprintf(stream, ", (uintptr_t)parm%d", i+1); fprintf(stream, ", (uintptr_t)parm%d", i + 1);
} }
} }
@ -385,9 +400,11 @@ static FILE *open_stub(void)
g_stubstream = fopen("STUB.h", "w"); g_stubstream = fopen("STUB.h", "w");
if (g_stubstream == NULL) if (g_stubstream == NULL)
{ {
fprintf(stderr, "Failed to open STUB.h: %s\n", strerror(errno)); fprintf(stderr, "Failed to open STUB.h: %s\n",
strerror(errno));
exit(9); exit(9);
} }
fprintf(g_stubstream, "/* Autogenerated STUB header file */\n\n"); fprintf(g_stubstream, "/* Autogenerated STUB header file */\n\n");
fprintf(g_stubstream, "#ifndef __STUB_H\n"); fprintf(g_stubstream, "#ifndef __STUB_H\n");
fprintf(g_stubstream, "#define __STUB_H\n\n"); fprintf(g_stubstream, "#define __STUB_H\n\n");
@ -397,18 +414,21 @@ static FILE *open_stub(void)
} }
else else
{ {
char filename[MAX_PARMSIZE+8]; char filename[MAX_PARMSIZE + 8];
FILE *stream; FILE *stream;
snprintf(filename, MAX_PARMSIZE+7, "STUB_%s.c", g_parm[NAME_INDEX]); snprintf(filename, MAX_PARMSIZE + 7, "STUB_%s.c", g_parm[NAME_INDEX]);
filename[MAX_PARMSIZE+7] = '\0'; filename[MAX_PARMSIZE + 7] = '\0';
stream = fopen(filename, "w"); stream = fopen(filename, "w");
if (stream == NULL) if (stream == NULL)
{ {
fprintf(stderr, "Failed to open %s: %s\n", filename, strerror(errno)); fprintf(stderr, "Failed to open %s: %s\n", filename,
strerror(errno));
exit(9); exit(9);
} }
return stream; return stream;
} }
} }
@ -431,7 +451,8 @@ static void generate_stub(int nparms)
/* Generate "up-front" information, include correct header files */ /* Generate "up-front" information, include correct header files */
fprintf(stream, "/* Auto-generated %s stub file -- do not edit */\n\n", g_parm[0]); fprintf(stream, "/* Auto-generated %s stub file -- do not edit */\n\n",
g_parm[0]);
fprintf(stream, "#include <nuttx/config.h>\n"); fprintf(stream, "#include <nuttx/config.h>\n");
fprintf(stream, "#include <stdint.h>\n"); fprintf(stream, "#include <stdint.h>\n");
@ -447,7 +468,9 @@ static void generate_stub(int nparms)
fprintf(stream, "#if %s\n\n", g_parm[COND_INDEX]); fprintf(stream, "#if %s\n\n", g_parm[COND_INDEX]);
} }
/* Generate the function definition that matches standard function prototype */ /* Generate the function definition that matches standard function
* prototype
*/
if (g_inline) if (g_inline)
{ {
@ -462,18 +485,18 @@ static void generate_stub(int nparms)
{ {
/* Check for a variable number of arguments */ /* Check for a variable number of arguments */
if (is_vararg(g_parm[PARM1_INDEX+i], i, nparms)) if (is_vararg(g_parm[PARM1_INDEX + i], i, nparms))
{ {
/* Always receive six arguments in this case */ /* Always receive six arguments in this case */
for (j = i+1; j <= 6; j++) for (j = i + 1; j <= 6; j++)
{ {
fprintf(stream, ", uintptr_t parm%d", j); fprintf(stream, ", uintptr_t parm%d", j);
} }
} }
else else
{ {
fprintf(stream, ", uintptr_t parm%d", i+1); fprintf(stream, ", uintptr_t parm%d", i + 1);
} }
} }
@ -499,14 +522,15 @@ static void generate_stub(int nparms)
for (i = 0; i < nparms; i++) for (i = 0; i < nparms; i++)
{ {
/* Get the formal type of the parameter, and get the type that we /* Get the formal type of the parameter, and get the type that we
* actually have to cast to. For example for a formal type like 'int parm[]' * actually have to cast to. For example for a formal type like
* we have to cast the actual parameter to 'int*'. The worst is a union * 'int parm[]' we have to cast the actual parameter to 'int*'.
* type like 'union sigval' where we have to cast to (union sigval)((FAR void *)parm) * The worst is a union type like 'union sigval' where we have to
* cast to (union sigval)((FAR void *)parm)
* -- Yech. * -- Yech.
*/ */
get_formalparmtype(g_parm[PARM1_INDEX+i], formal); get_formalparmtype(g_parm[PARM1_INDEX + i], formal);
get_actualparmtype(g_parm[PARM1_INDEX+i], actual); get_actualparmtype(g_parm[PARM1_INDEX + i], actual);
/* Treat the first argument in the list differently from the others.. /* Treat the first argument in the list differently from the others..
* It does not need a comma before it. * It does not need a comma before it.
@ -520,7 +544,7 @@ static void generate_stub(int nparms)
{ {
/* Always pass six arguments */ /* Always pass six arguments */
for (j = i+1; j <= 6; j++) for (j = i + 1; j <= 6; j++)
{ {
fprintf(stream, ", parm%d", j); fprintf(stream, ", parm%d", j);
} }
@ -529,11 +553,12 @@ static void generate_stub(int nparms)
{ {
if (is_union(formal)) if (is_union(formal))
{ {
fprintf(stream, ", (%s)((%s)parm%d)", formal, actual, i+1); fprintf(stream, ", (%s)((%s)parm%d)", formal, actual,
i + 1);
} }
else else
{ {
fprintf(stream, ", (%s)parm%d", actual, i+1); fprintf(stream, ", (%s)parm%d", actual, i + 1);
} }
} }
} }
@ -541,11 +566,11 @@ static void generate_stub(int nparms)
{ {
if (is_union(formal)) if (is_union(formal))
{ {
fprintf(stream, "(%s)((%s)parm%d)", formal, actual, i+1); fprintf(stream, "(%s)((%s)parm%d)", formal, actual, i + 1);
} }
else else
{ {
fprintf(stream, "(%s)parm%d",actual, i+1); fprintf(stream, "(%s)parm%d", actual, i + 1);
} }
} }
} }
@ -567,6 +592,7 @@ static void generate_stub(int nparms)
{ {
fprintf(stream, "#endif /* %s */\n", g_parm[COND_INDEX]); fprintf(stream, "#endif /* %s */\n", g_parm[COND_INDEX]);
} }
stub_close(stream); stub_close(stream);
} }
@ -647,7 +673,7 @@ int main(int argc, char **argv, char **envp)
/* Open the CSV file */ /* Open the CSV file */
stream= fopen(csvpath, "r"); stream = fopen(csvpath, "r");
if (!stream) if (!stream)
{ {
fprintf(stderr, "open %s failed: %s\n", csvpath, strerror(errno)); fprintf(stderr, "open %s failed: %s\n", csvpath, strerror(errno));