From 8b998cb538368dec01c28fe0603e5eb87b0c3f32 Mon Sep 17 00:00:00 2001 From: Simon Marchetto Date: Fri, 26 Sep 2014 17:23:27 +0200 Subject: [PATCH] scilab: truncates too long (struct, class) member names --- .../scilab/scilab_identifier_name_runme.sci | 16 +++- Examples/test-suite/scilab_identifier_name.i | 37 ++++++++-- Source/Modules/scilab.cxx | 73 +++++++++++++++---- 3 files changed, 102 insertions(+), 24 deletions(-) diff --git a/Examples/test-suite/scilab/scilab_identifier_name_runme.sci b/Examples/test-suite/scilab/scilab_identifier_name_runme.sci index 1eaf8ce09..9a4f3cc08 100644 --- a/Examples/test-suite/scilab/scilab_identifier_name_runme.sci +++ b/Examples/test-suite/scilab/scilab_identifier_name_runme.sci @@ -1,19 +1,29 @@ exec("swigtest.start", -1); -// Not truncated identifier names + +// Test truncating variables, constants, functions identifier names +// not truncated gvar_identifier_name_set(-101); checkequal(gvar_identifier_name_get(), -101, "gvar_identifier_name_get()"); checkequal(CONS_IDENTIFIER_NAME_get(), -11, "CONS_IDENTIFIER_NAME_get()"); checkequal(function_identifier_name(), -21, "function_identifier_name()"); -// Truncated identifier names +// truncated too_long_gvar_identi_set(101); 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_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_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); diff --git a/Examples/test-suite/scilab_identifier_name.i b/Examples/test-suite/scilab_identifier_name.i index 7c0cb2965..1daa2cd46 100644 --- a/Examples/test-suite/scilab_identifier_name.i +++ b/Examples/test-suite/scilab_identifier_name.i @@ -1,17 +1,18 @@ %module scilab_identifier_name +// +// Test long identifier name (> 24 characters) truncating +// -// Test identifier name truncating -// (when variables, fonctions, constants names exceed 24 charaters long) +// Test truncating variables, constants, functions identifier names %inline %{ - -// These identifier names wont be truncated +// these identifier names wont be truncated int gvar_identifier_name = -1; #define CONS_IDENTIFIER_NAME -11 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_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_2() { return 22; }; - %} - -// Test when %scilabconst mode is activated +// Test truncating when %scilabconst mode is activated %scilabconst(1); %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_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; }; +}; + +%} + + + + + + + + + + + diff --git a/Source/Modules/scilab.cxx b/Source/Modules/scilab.cxx index 6235b04e0..af21a492d 100644 --- a/Source/Modules/scilab.cxx +++ b/Source/Modules/scilab.cxx @@ -15,7 +15,8 @@ /*#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 *) "\ @@ -484,7 +485,7 @@ public: /* Dump the function out */ 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 */ if (isLastOverloaded) { @@ -555,8 +556,8 @@ public: String *origVariableName = Getattr(node, "name"); // Ex: Shape::nshapes 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 - String* scilabVariableName = checkIdentifierName(variableName, SCILAB_IDENTIFIER_CHAR_MAX - 4); + // Variable names can have SCILAB_VARIABLE_NAME_CHAR_MAX because of suffixes "_get" or "_set" added to function + String* scilabVariableName = checkIdentifierName(variableName, SCILAB_VARIABLE_NAME_CHAR_MAX); /* Manage GET function */ Wrapper *getFunctionWrapper = NewWrapper(); @@ -644,7 +645,7 @@ public: constantTypemap = Swig_typemap_lookup("scilabconstcode", node, nodeName, 0); 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); Replaceall(constantTypemap, "$result", scilabConstantName); @@ -666,8 +667,8 @@ public: constantValue = wname; } - // Constant names can have SCILAB_IDENTIFIER_CHAR_MAX - 4 because of suffixes "_get" added to function - String *scilabConstantName = checkIdentifierName(constantName, SCILAB_IDENTIFIER_CHAR_MAX - 4); + // Constant names can have SCILAB_VARIABLE_NAME_CHAR_MAX because of suffixes "_get" added to function + String *scilabConstantName = checkIdentifierName(constantName, SCILAB_VARIABLE_NAME_CHAR_MAX); /* Create GET function to get the constant value */ Wrapper *getFunctionWrapper = NewWrapper(); @@ -743,24 +744,70 @@ public: return Language::enumvalueDeclaration(node); } + /* --------------------------------------------------------------------- + * membervariableHandler() + * --------------------------------------------------------------------- */ + virtual int membervariableHandler(Node *node) { + checkMemberIdentifierName(node, SCILAB_VARIABLE_NAME_CHAR_MAX); + return Language::membervariableHandler(node); + } + /* ----------------------------------------------------------------------- * 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) * ----------------------------------------------------------------------- */ String *checkIdentifierName(String *name, int char_size_max) { - String *scilabFunctionName; + String *scilabIdentifierName; 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, "Identifier name '%s' exceeds 24 characters and has been truncated to '%s'.\n", - name, scilabFunctionName); + name, scilabIdentifierName); } else - scilabFunctionName = name; - return scilabFunctionName; + scilabIdentifierName = name; + 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() * ----------------------------------------------------------------------- */