scilab: truncates too long (struct, class) member names
This commit is contained in:
parent
2bfb473b6f
commit
8b998cb538
3 changed files with 102 additions and 24 deletions
|
|
@ -1,19 +1,29 @@
|
||||||
exec("swigtest.start", -1);
|
exec("swigtest.start", -1);
|
||||||
|
|
||||||
// Not truncated identifier names
|
|
||||||
|
// Test truncating variables, constants, functions identifier names
|
||||||
|
// not truncated
|
||||||
gvar_identifier_name_set(-101);
|
gvar_identifier_name_set(-101);
|
||||||
checkequal(gvar_identifier_name_get(), -101, "gvar_identifier_name_get()");
|
checkequal(gvar_identifier_name_get(), -101, "gvar_identifier_name_get()");
|
||||||
checkequal(CONS_IDENTIFIER_NAME_get(), -11, "CONS_IDENTIFIER_NAME_get()");
|
checkequal(CONS_IDENTIFIER_NAME_get(), -11, "CONS_IDENTIFIER_NAME_get()");
|
||||||
checkequal(function_identifier_name(), -21, "function_identifier_name()");
|
checkequal(function_identifier_name(), -21, "function_identifier_name()");
|
||||||
|
|
||||||
// Truncated identifier names
|
// truncated
|
||||||
too_long_gvar_identi_set(101);
|
too_long_gvar_identi_set(101);
|
||||||
checkequal(too_long_gvar_identi_get(), 101, "too_long_variable_id_get()");
|
checkequal(too_long_gvar_identi_get(), 101, "too_long_variable_id_get()");
|
||||||
checkequal(TOO_LONG_CONST_IDENT_get(), 11, "TOO_LONG_CONST_IDENT_get()");
|
checkequal(TOO_LONG_CONST_IDENT_get(), 11, "TOO_LONG_CONST_IDENT_get()");
|
||||||
checkequal(too_long_function_identi(), 21, "too_long_function_identi()");
|
checkequal(too_long_function_identi(), 21, "too_long_function_identi()");
|
||||||
|
|
||||||
// Test identifier names in scilabconst mode
|
// Test truncating when %scilabconst mode is activated
|
||||||
checkequal(SC_CONST_IDENTIFIER_NAME, int32(-12), "SC_TOO_LONG_IDENTIF");
|
checkequal(SC_CONST_IDENTIFIER_NAME, int32(-12), "SC_TOO_LONG_IDENTIF");
|
||||||
checkequal(SC_TOO_LONG_CONST_IDENTI, int32(14), "SC_TOO_LONG_IDENTIF");
|
checkequal(SC_TOO_LONG_CONST_IDENTI, int32(14), "SC_TOO_LONG_IDENTIF");
|
||||||
|
|
||||||
|
// Test truncating in the case of struct
|
||||||
|
st = new_st();
|
||||||
|
st_m_identifier_name_set(st, 15);
|
||||||
|
checkequal(st_m_identifier_name_get(st), 15, "st_m_identifier_name_get(st)");
|
||||||
|
st_too_long_member_i_set(st, 25);
|
||||||
|
checkequal(st_too_long_member_i_get(st), 25, "st_too_long_member_i_get(st)");
|
||||||
|
delete_st(st);
|
||||||
|
|
||||||
exec("swigtest.quit", -1);
|
exec("swigtest.quit", -1);
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,18 @@
|
||||||
%module scilab_identifier_name
|
%module scilab_identifier_name
|
||||||
|
|
||||||
|
//
|
||||||
|
// Test long identifier name (> 24 characters) truncating
|
||||||
|
//
|
||||||
|
|
||||||
// Test identifier name truncating
|
// Test truncating variables, constants, functions identifier names
|
||||||
// (when variables, fonctions, constants names exceed 24 charaters long)
|
|
||||||
|
|
||||||
%inline %{
|
%inline %{
|
||||||
|
// these identifier names wont be truncated
|
||||||
// These identifier names wont be truncated
|
|
||||||
int gvar_identifier_name = -1;
|
int gvar_identifier_name = -1;
|
||||||
#define CONS_IDENTIFIER_NAME -11
|
#define CONS_IDENTIFIER_NAME -11
|
||||||
int function_identifier_name() { return -21; };
|
int function_identifier_name() { return -21; };
|
||||||
|
|
||||||
// These identifier names will be truncated
|
// these identifier names will be truncated
|
||||||
int too_long_gvar_identifier_name_1 = 1;
|
int too_long_gvar_identifier_name_1 = 1;
|
||||||
int too_long_gvar_identifier_name_2 = 2;
|
int too_long_gvar_identifier_name_2 = 2;
|
||||||
|
|
||||||
|
|
@ -20,11 +21,9 @@ int too_long_gvar_identifier_name_2 = 2;
|
||||||
|
|
||||||
int too_long_function_identifier_name_1() { return 21; };
|
int too_long_function_identifier_name_1() { return 21; };
|
||||||
int too_long_function_identifier_name_2() { return 22; };
|
int too_long_function_identifier_name_2() { return 22; };
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
// Test truncating when %scilabconst mode is activated
|
||||||
// Test when %scilabconst mode is activated
|
|
||||||
%scilabconst(1);
|
%scilabconst(1);
|
||||||
|
|
||||||
%inline %{
|
%inline %{
|
||||||
|
|
@ -33,3 +32,25 @@ int too_long_function_identifier_name_2() { return 22; };
|
||||||
#define SC_TOO_LONG_CONST_IDENTIFIER_NAME_1 13
|
#define SC_TOO_LONG_CONST_IDENTIFIER_NAME_1 13
|
||||||
#define SC_TOO_LONG_CONST_IDENTIFIER_NAME_2 14
|
#define SC_TOO_LONG_CONST_IDENTIFIER_NAME_2 14
|
||||||
%}
|
%}
|
||||||
|
%scilabconst(0);
|
||||||
|
|
||||||
|
// Test truncating in the case of struct
|
||||||
|
%inline %{
|
||||||
|
struct st {
|
||||||
|
int m_identifier_name;
|
||||||
|
int too_long_member_identifier_name;
|
||||||
|
int too_long_member_function_name() { return 31; };
|
||||||
|
};
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,8 @@
|
||||||
|
|
||||||
/*#define SWIG_DEBUG*/
|
/*#define SWIG_DEBUG*/
|
||||||
|
|
||||||
#define SCILAB_IDENTIFIER_CHAR_MAX 24
|
#define SCILAB_IDENTIFIER_NAME_CHAR_MAX 24
|
||||||
|
#define SCILAB_VARIABLE_NAME_CHAR_MAX SCILAB_IDENTIFIER_NAME_CHAR_MAX - 4
|
||||||
|
|
||||||
|
|
||||||
static const char *usage = (char *) "\
|
static const char *usage = (char *) "\
|
||||||
|
|
@ -484,7 +485,7 @@ public:
|
||||||
/* Dump the function out */
|
/* Dump the function out */
|
||||||
Wrapper_print(wrapper, wrappersSection);
|
Wrapper_print(wrapper, wrappersSection);
|
||||||
|
|
||||||
String *scilabFunctionName = checkIdentifierName(functionName, SCILAB_IDENTIFIER_CHAR_MAX);
|
String *scilabFunctionName = checkIdentifierName(functionName, SCILAB_IDENTIFIER_NAME_CHAR_MAX);
|
||||||
|
|
||||||
/* Update builder.sce contents */
|
/* Update builder.sce contents */
|
||||||
if (isLastOverloaded) {
|
if (isLastOverloaded) {
|
||||||
|
|
@ -555,8 +556,8 @@ public:
|
||||||
String *origVariableName = Getattr(node, "name"); // Ex: Shape::nshapes
|
String *origVariableName = Getattr(node, "name"); // Ex: Shape::nshapes
|
||||||
String *variableName = Getattr(node, "sym:name"); // Ex; Shape_nshapes (can be used for function names, ...)
|
String *variableName = Getattr(node, "sym:name"); // Ex; Shape_nshapes (can be used for function names, ...)
|
||||||
|
|
||||||
// Variable names can have SCILAB_IDENTIFIER_CHAR_MAX - 4 because of suffixes "_get" or "_set" added to function
|
// Variable names can have SCILAB_VARIABLE_NAME_CHAR_MAX because of suffixes "_get" or "_set" added to function
|
||||||
String* scilabVariableName = checkIdentifierName(variableName, SCILAB_IDENTIFIER_CHAR_MAX - 4);
|
String* scilabVariableName = checkIdentifierName(variableName, SCILAB_VARIABLE_NAME_CHAR_MAX);
|
||||||
|
|
||||||
/* Manage GET function */
|
/* Manage GET function */
|
||||||
Wrapper *getFunctionWrapper = NewWrapper();
|
Wrapper *getFunctionWrapper = NewWrapper();
|
||||||
|
|
@ -644,7 +645,7 @@ public:
|
||||||
|
|
||||||
constantTypemap = Swig_typemap_lookup("scilabconstcode", node, nodeName, 0);
|
constantTypemap = Swig_typemap_lookup("scilabconstcode", node, nodeName, 0);
|
||||||
if (constantTypemap != NULL) {
|
if (constantTypemap != NULL) {
|
||||||
String *scilabConstantName = checkIdentifierName(constantName, SCILAB_IDENTIFIER_CHAR_MAX);
|
String *scilabConstantName = checkIdentifierName(constantName, SCILAB_IDENTIFIER_NAME_CHAR_MAX);
|
||||||
|
|
||||||
Setattr(node, "wrap:name", constantName);
|
Setattr(node, "wrap:name", constantName);
|
||||||
Replaceall(constantTypemap, "$result", scilabConstantName);
|
Replaceall(constantTypemap, "$result", scilabConstantName);
|
||||||
|
|
@ -666,8 +667,8 @@ public:
|
||||||
constantValue = wname;
|
constantValue = wname;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constant names can have SCILAB_IDENTIFIER_CHAR_MAX - 4 because of suffixes "_get" added to function
|
// Constant names can have SCILAB_VARIABLE_NAME_CHAR_MAX because of suffixes "_get" added to function
|
||||||
String *scilabConstantName = checkIdentifierName(constantName, SCILAB_IDENTIFIER_CHAR_MAX - 4);
|
String *scilabConstantName = checkIdentifierName(constantName, SCILAB_VARIABLE_NAME_CHAR_MAX);
|
||||||
|
|
||||||
/* Create GET function to get the constant value */
|
/* Create GET function to get the constant value */
|
||||||
Wrapper *getFunctionWrapper = NewWrapper();
|
Wrapper *getFunctionWrapper = NewWrapper();
|
||||||
|
|
@ -743,24 +744,70 @@ public:
|
||||||
return Language::enumvalueDeclaration(node);
|
return Language::enumvalueDeclaration(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------
|
||||||
|
* membervariableHandler()
|
||||||
|
* --------------------------------------------------------------------- */
|
||||||
|
virtual int membervariableHandler(Node *node) {
|
||||||
|
checkMemberIdentifierName(node, SCILAB_VARIABLE_NAME_CHAR_MAX);
|
||||||
|
return Language::membervariableHandler(node);
|
||||||
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------
|
/* -----------------------------------------------------------------------
|
||||||
* checkIdentifierName()
|
* checkIdentifierName()
|
||||||
* Truncates (and displays a warning) too long identifier names
|
* Truncates (and displays a warning) for too long identifier names
|
||||||
|
* (applies on functions, variables, constants...)
|
||||||
* (Scilab identifiers names are limited to 24 chars max)
|
* (Scilab identifiers names are limited to 24 chars max)
|
||||||
* ----------------------------------------------------------------------- */
|
* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
String *checkIdentifierName(String *name, int char_size_max) {
|
String *checkIdentifierName(String *name, int char_size_max) {
|
||||||
String *scilabFunctionName;
|
String *scilabIdentifierName;
|
||||||
if (Len(name) > char_size_max) {
|
if (Len(name) > char_size_max) {
|
||||||
scilabFunctionName = DohNewStringWithSize(name, char_size_max);
|
scilabIdentifierName = DohNewStringWithSize(name, char_size_max);
|
||||||
Swig_warning(WARN_SCILAB_TRUNCATED_NAME, input_file, line_number,
|
Swig_warning(WARN_SCILAB_TRUNCATED_NAME, input_file, line_number,
|
||||||
"Identifier name '%s' exceeds 24 characters and has been truncated to '%s'.\n",
|
"Identifier name '%s' exceeds 24 characters and has been truncated to '%s'.\n",
|
||||||
name, scilabFunctionName);
|
name, scilabIdentifierName);
|
||||||
} else
|
} else
|
||||||
scilabFunctionName = name;
|
scilabIdentifierName = name;
|
||||||
return scilabFunctionName;
|
return scilabIdentifierName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
* checkMemberIdentifierName()
|
||||||
|
* Truncates (and displays a warning) too long member identifier names
|
||||||
|
* (applies on members of structs, classes...)
|
||||||
|
* (Scilab identifiers names are limited to 24 chars max)
|
||||||
|
* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void checkMemberIdentifierName(Node *node, int char_size_max) {
|
||||||
|
|
||||||
|
String *memberName = Getattr(node, "sym:name");
|
||||||
|
|
||||||
|
Node *containerNode = parentNode(node);
|
||||||
|
String *containerName = Getattr(containerNode, "sym:name");
|
||||||
|
|
||||||
|
int lenContainerName = Len(containerName);
|
||||||
|
int lenMemberName = Len(memberName);
|
||||||
|
|
||||||
|
if (lenContainerName + lenMemberName + 1 > char_size_max) {
|
||||||
|
int lenScilabMemberName = char_size_max - lenContainerName - 1;
|
||||||
|
String *scilabMemberName = DohNewStringWithSize(memberName, lenScilabMemberName);
|
||||||
|
|
||||||
|
if (lenScilabMemberName > 0) {
|
||||||
|
Setattr(node, "sym:name", scilabMemberName);
|
||||||
|
Swig_warning(WARN_SCILAB_TRUNCATED_NAME, input_file, line_number,
|
||||||
|
"Wrapping functions names for member '%s.%s' will exceed 24 characters, "
|
||||||
|
"so member name has been truncated to '%s'.\n",
|
||||||
|
containerName, memberName, scilabMemberName);
|
||||||
|
} else
|
||||||
|
Swig_error(input_file, line_number,
|
||||||
|
"Wrapping functions names for member name '%s.%s' will exceed 24 characters, "
|
||||||
|
"please rename the container of member '%s'.\n",
|
||||||
|
containerName, memberName, containerName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------
|
/* -----------------------------------------------------------------------
|
||||||
* addHelperFunctions()
|
* addHelperFunctions()
|
||||||
* ----------------------------------------------------------------------- */
|
* ----------------------------------------------------------------------- */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue