@@ -279,17 +279,17 @@ bool is_valid_identifier(const_String_or_char_ptr name) {
279
279
* Requires input to be longer than 63 chars.
280
280
* Returns new'd string.
281
281
*/
282
- String *shorten_identifier (String *inp, int warning = WARN_NONE ) {
283
- assert (Len (inp) > 63 );
284
- String *result = NewStringWithSize (inp, 63 );
282
+ String *shorten_identifier (String *inp, int maxlen, int warning ) {
283
+ assert (Len (inp) > maxlen );
284
+ String *result = NewStringWithSize (inp, maxlen );
285
285
unsigned int hash = 5381 ;
286
286
// Hash truncated characters *AND* characters that might be replaced by the hash
287
287
// (2**8 / (10 + 26)) =~ 7.1, so backtrack 8 chars
288
- for (const char *src = Char (inp) + 63 - 8 ; *src != ' \0 ' ; ++src) {
288
+ for (const char *src = Char (inp) + maxlen - 8 ; *src != ' \0 ' ; ++src) {
289
289
hash = (hash * 33 + *src) & 0xffffffffu ;
290
290
}
291
291
// Replace the last chars with the hash encoded into 0-10 + A-Z
292
- char *dst = Char (result) + 63 ;
292
+ char *dst = Char (result) + maxlen ;
293
293
while (hash > 0 ) {
294
294
unsigned long rem = hash % 36 ;
295
295
hash = hash / 36 ;
@@ -311,9 +311,9 @@ String *shorten_identifier(String *inp, int warning = WARN_NONE) {
311
311
*
312
312
* *assumes ownership of input and returns new'd value*
313
313
*/
314
- String *ensure_short (String *str, int warning = WARN_NONE) {
315
- if (Len (str) > 63 ) {
316
- String *shortened = shorten_identifier (str, warning);
314
+ String *ensure_short (String *str, int maxlen= 63 , int warning= WARN_NONE) {
315
+ if (Len (str) > maxlen ) {
316
+ String *shortened = shorten_identifier (str, maxlen, warning);
317
317
assert (is_valid_identifier (shortened));
318
318
Delete (str);
319
319
str = shortened;
@@ -387,7 +387,7 @@ String *make_fname(String *name, int warning = WARN_LANG_IDENTIFIER) {
387
387
}
388
388
389
389
// The beginning of the string is set up; now capture and shorten if too long
390
- result = ensure_short (result ? result : Copy (name), warning);
390
+ result = ensure_short (result ? result : Copy (name), 63 , warning);
391
391
392
392
assert (is_valid_identifier (result));
393
393
return result;
@@ -1077,10 +1077,12 @@ int FORTRAN::functionWrapper(Node *n) {
1077
1077
String *fname = NULL ; // Fortran proxy function name; null if bind(C)
1078
1078
String *imname = NULL ; // Fortran interface function name
1079
1079
String *wname = NULL ; // SWIG C wrapper function name
1080
+ String *overload_ext = Getattr (n, " sym:overloaded" ) ? Getattr (n, " sym:overname" ) : NULL ;
1080
1081
1081
1082
// Generate a unique wrapper name
1082
1083
wname = Swig_name_wrapper (symname);
1083
- imname = ensure_short (NewStringf (" swigc_%s" , symname));
1084
+ imname = ensure_short (NewStringf (" swigc_%s" , symname),
1085
+ 63 - (overload_ext ? Len (overload_ext) : 0 ));
1084
1086
1085
1087
if (String *private_fname = Getattr (n, " fortran:fname" )) {
1086
1088
// Create "private" fortran wrapper function class (swigf_xx) name that will be bound to a class
@@ -1120,6 +1122,7 @@ int FORTRAN::functionWrapper(Node *n) {
1120
1122
fsymname = fname;
1121
1123
fname = proxy_name_construct (this ->getNSpace (), symname);
1122
1124
}
1125
+ fname = ensure_short (fname, 63 - Len (overload_ext));
1123
1126
Append (fname, overload_ext);
1124
1127
generic = true ;
1125
1128
}
0 commit comments