@@ -57,7 +57,7 @@ DLL_PUBLIC void GDL_CDECL IDL_Deltmp(GDL_REGISTER EXPORT_VPTR v) {
57
57
v->value .arr =NULL ;
58
58
if (v->type == GDL_TYP_STRUCT) {free (v->value .s .sdef );v->value .s .sdef =NULL ;}
59
59
} else if (v->type == GDL_TYP_STRING) {
60
- if (v->value .str .slen != 0 ) {free (v->value .str .s );v->value .str .s =NULL ;v->value .str .slen =0 ;}
60
+ if (v->value .str .slen != 0 && v-> value . str . stype == 1 ) {free (v->value .str .s );v->value .str .s =NULL ;v->value .str .slen = 0 ;v-> value . str . stype =0 ;}
61
61
}
62
62
}
63
63
}
@@ -616,7 +616,7 @@ BaseGDL* VPTR_ToGDL(EXPORT_VPTR v, bool protect=false) {
616
616
default : GDL_WillThrowAfterCleaning (" ReturnEXPORT_VPTR_AsGDL: bad array case." );
617
617
}
618
618
}
619
- throw ;
619
+ return NULL ;
620
620
}
621
621
#undef DOCASE
622
622
#undef DOCASE_ARRAY
@@ -692,7 +692,7 @@ DLL_PUBLIC EXPORT_VPTR GDL_CDECL IDL_ImportNamedArray(char *name, int n_dim, EX
692
692
default :
693
693
GDL_WillThrowAfterCleaning (" CreateNewGDLArray failure." );
694
694
}
695
- throw ;
695
+ return NULL ;
696
696
}
697
697
#undef DOCASE
698
698
@@ -872,9 +872,9 @@ DLL_PUBLIC void GDL_CDECL IDL_PrintF(int argc, EXPORT_VPTR *argv, char *argk) {
872
872
873
873
DLL_PUBLIC void GDL_CDECL IDL_StrStore (EXPORT_STRING *s, const char *fs){TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__)
874
874
s->slen =strlen (fs);
875
- s->stype =0 ;
876
- s->s =(char *)malloc (s->slen );
877
- strncpy (s->s ,fs,s->slen );
875
+ s->stype =1 ;
876
+ s->s =(char *)malloc (s->slen + 1 );
877
+ strncpy (s->s ,fs,s->slen + 1 );
878
878
}
879
879
DLL_PUBLIC char * GDL_CDECL IDL_VarGetString (EXPORT_VPTR s) {
880
880
if (s->type != GDL_TYP_STRING) GDL_WillThrowAfterCleaning (" IDL_VarGetString: variable is not a string." );
@@ -893,13 +893,18 @@ DLL_PUBLIC void GDL_CDECL IDL_StrDup(GDL_REGISTER EXPORT_STRING *str, GDL_REGIS
893
893
char * news=(char *)malloc (str[i].slen +1 );
894
894
strncpy (news,str[i].s ,str[i].slen +1 );
895
895
str[i].s =news;
896
+ str[i].stype =1 ;
896
897
}
897
898
}
898
899
}
899
900
900
901
DLL_PUBLIC void GDL_CDECL IDL_StrDelete (EXPORT_STRING *str, EXPORT_MEMINT n) {TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__)
901
- for (auto i=0 ; i< n; ++i) if (str[i].slen > 0 ) free (str[i].s );
902
+ for (auto i=0 ; i< n; ++i) {
903
+ if (str[i].slen > 0 && str[i].stype ==1 ) free (str[i].s );
904
+ str[i].slen =0 ;
905
+ str[i].stype =0 ;
902
906
}
907
+ }
903
908
904
909
// n: The number of characters the string must be able to contain, not including the terminating NULL character.
905
910
DLL_PUBLIC void GDL_CDECL IDL_StrEnsureLength (EXPORT_STRING *s, int n) {TRACE_ROUTINE (__FUNCTION__, __FILE__, __LINE__)
@@ -914,9 +919,11 @@ DLL_PUBLIC EXPORT_VPTR GDL_CDECL IDL_StrToSTRING(const char *s) {TRACE_ROUTINE(
914
919
EXPORT_VPTR ret = NewTMPVPTR ();
915
920
ret->type = GDL_TYP_STRING;
916
921
ret->flags = GDL_V_TEMP;
917
- ret->value .str .slen = strlen (s);
918
- ret->value .str .stype = 0 ;
919
- ret->value .str .s =(char *)s;
922
+ size_t l=strlen (s);
923
+ ret->value .str .slen = l;
924
+ ret->value .str .stype = 1 ;
925
+ ret->value .str .s =(char *) malloc (l+1 );
926
+ strncpy (ret->value .str .s ,s,l+1 );
920
927
return ret;
921
928
}
922
929
@@ -1022,7 +1029,7 @@ DLL_PUBLIC double GDL_CDECL IDL_DoubleScalar(GDL_REGISTER EXPORT_VPTR v) {TRACE
1022
1029
DOCASE (double , GDL_TYP_ULONG64, ul64);
1023
1030
default : GDL_WillThrowAfterCleaning (" IDL_DoubleScalar: unexpected type " +i2s (v->type ));
1024
1031
}
1025
- throw ;
1032
+ return 0 ;
1026
1033
}
1027
1034
DLL_PUBLIC EXPORT_ULONG GDL_CDECL IDL_ULongScalar (GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__)
1028
1035
GDL_ENSURE_SIMPLE (v);
@@ -1040,7 +1047,7 @@ DLL_PUBLIC EXPORT_ULONG GDL_CDECL IDL_ULongScalar(GDL_REGISTER EXPORT_VPTR v) {
1040
1047
DOCASE (EXPORT_ULONG, GDL_TYP_ULONG64, ul64);
1041
1048
default : GDL_WillThrowAfterCleaning (" IDL_ULongScalar: unexpected type " +i2s (v->type ));
1042
1049
}
1043
- throw ;
1050
+ return 0 ;
1044
1051
}
1045
1052
DLL_PUBLIC EXPORT_LONG GDL_CDECL IDL_LongScalar (GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__)
1046
1053
GDL_ENSURE_SIMPLE (v);
@@ -1058,7 +1065,7 @@ DLL_PUBLIC EXPORT_LONG GDL_CDECL IDL_LongScalar(GDL_REGISTER EXPORT_VPTR v) {TR
1058
1065
DOCASE (EXPORT_LONG, GDL_TYP_ULONG64, ul64);
1059
1066
default : GDL_WillThrowAfterCleaning (" IDL_LongScalar: unexpected type " +i2s (v->type ));
1060
1067
}
1061
- throw ;
1068
+ return 0 ;
1062
1069
}
1063
1070
DLL_PUBLIC EXPORT_LONG64 GDL_CDECL IDL_Long64Scalar (GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__)
1064
1071
GDL_ENSURE_SIMPLE (v);
@@ -1076,7 +1083,7 @@ DLL_PUBLIC EXPORT_LONG64 GDL_CDECL IDL_Long64Scalar(GDL_REGISTER EXPORT_VPTR v)
1076
1083
DOCASE (EXPORT_LONG64, GDL_TYP_ULONG64, ul64);
1077
1084
default : GDL_WillThrowAfterCleaning (" IDL_Long64Scalar: unexpected type " +i2s (v->type ));
1078
1085
}
1079
- throw ;
1086
+ return 0 ;
1080
1087
}
1081
1088
DLL_PUBLIC EXPORT_ULONG64 GDL_CDECL IDL_ULong64Scalar (GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__)
1082
1089
GDL_ENSURE_SIMPLE (v);
@@ -1094,7 +1101,7 @@ DLL_PUBLIC EXPORT_ULONG64 GDL_CDECL IDL_ULong64Scalar(GDL_REGISTER EXPORT_VPTR
1094
1101
DOCASE (EXPORT_ULONG64, GDL_TYP_ULONG64, ul64);
1095
1102
default : GDL_WillThrowAfterCleaning (" IDL_ULong64Scalar: unexpected type " +i2s (v->type ));
1096
1103
}
1097
- throw ;
1104
+ return 0 ;
1098
1105
}
1099
1106
DLL_PUBLIC EXPORT_MEMINT GDL_CDECL IDL_MEMINTScalar (GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__)
1100
1107
GDL_ENSURE_SIMPLE (v);
@@ -1112,7 +1119,7 @@ DLL_PUBLIC EXPORT_MEMINT GDL_CDECL IDL_MEMINTScalar(GDL_REGISTER EXPORT_VPTR v)
1112
1119
DOCASE (EXPORT_MEMINT, GDL_TYP_ULONG64, ul64);
1113
1120
default : GDL_WillThrowAfterCleaning (" IDL_ULong64Scalar: unexpected type " +i2s (v->type ));
1114
1121
}
1115
- throw ;
1122
+ return 0 ;
1116
1123
}
1117
1124
DLL_PUBLIC EXPORT_FILEINT GDL_CDECL IDL_FILEINTScalar (GDL_REGISTER EXPORT_VPTR v) {TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__)
1118
1125
GDL_ENSURE_SIMPLE (v);
@@ -1130,7 +1137,7 @@ DLL_PUBLIC EXPORT_FILEINT GDL_CDECL IDL_FILEINTScalar(GDL_REGISTER EXPORT_VPTR
1130
1137
DOCASE (EXPORT_FILEINT, GDL_TYP_ULONG64, ul64);
1131
1138
default : GDL_WillThrowAfterCleaning (" IDL_ULong64Scalar: unexpected type " +i2s (v->type ));
1132
1139
}
1133
- throw ;
1140
+ return 0 ;
1134
1141
}
1135
1142
#undef DOCASE
1136
1143
#undef DOCASE_CMP
@@ -1167,7 +1174,6 @@ void gdlInitVector(void* arr, int type, size_t nelts) {
1167
1174
DOCASE_ARRAY (GDL_TYP_ULONG64, EXPORT_ULONG64);
1168
1175
default : GDL_WillThrowAfterCleaning (" IDL_MakeTempVector: unexpected type " + i2s (type));
1169
1176
}
1170
- throw ;
1171
1177
}
1172
1178
#undef DOCASE_ARRAY
1173
1179
#undef DOCASE_ARRAY_CPLX
@@ -1189,14 +1195,15 @@ if (init == GDL_ARR_INI_ZERO) memset((void*)addr, 0, l);
1189
1195
else if (init == GDL_ARR_INI_INDEX) {
1190
1196
if (type == GDL_TYP_STRING) {
1191
1197
EXPORT_LONG64 nelts=v->value .arr ->n_elts ;
1192
- static int slen = IDL_OutputFormatLenFunc (GDL_TYP_LONG)+ 1 ;
1198
+ static int slen = IDL_OutputFormatLenFunc (GDL_TYP_LONG);
1193
1199
// allocate size:
1194
- char * allstrings = (char *)malloc (nelts * slen);
1200
+ char * allstrings = (char *)malloc (nelts * ( slen+ 1 ) );
1195
1201
EXPORT_STRING *thestrings = (EXPORT_STRING *) v->value .arr ->data ;
1202
+ char * fmt=IDL_OutputFormatFunc (GDL_TYP_LONG);
1196
1203
for (auto i = 0 ; i < nelts; ++i) {
1197
1204
thestrings[i].slen = slen;
1198
- thestrings[i].s = &(allstrings[i * slen]);
1199
- snprintf (thestrings[i].s ,IDL_OutputFormatLenFunc (GDL_TYP_LONG), IDL_OutputFormatFunc (GDL_TYP_LONG) , i);
1205
+ thestrings[i].s = &(allstrings[i * ( slen+ 1 ) ]);
1206
+ snprintf (thestrings[i].s ,slen+ 1 , fmt , i);
1200
1207
}
1201
1208
} else gdlInitVector (addr, type, l);
1202
1209
}
@@ -1242,14 +1249,15 @@ if (init == GDL_ARR_INI_ZERO) memset((void*)addr, 0, l);
1242
1249
else if (init == GDL_ARR_INI_INDEX) {
1243
1250
if (type == GDL_TYP_STRING) {
1244
1251
EXPORT_LONG64 nelts=v->value .arr ->n_elts ;
1245
- static int slen = IDL_OutputFormatLenFunc (GDL_TYP_LONG)+ 1 ;
1252
+ static int slen = IDL_OutputFormatLenFunc (GDL_TYP_LONG);
1246
1253
// allocate size:
1247
- char * allstrings = (char *)malloc (nelts * slen);
1254
+ char * allstrings = (char *)malloc (nelts * ( slen+ 1 ) );
1248
1255
EXPORT_STRING *thestrings = (EXPORT_STRING *) v->value .arr ->data ;
1256
+ char * fmt=IDL_OutputFormatFunc (GDL_TYP_LONG);
1249
1257
for (auto i = 0 ; i < nelts; ++i) {
1250
1258
thestrings[i].slen = slen;
1251
- thestrings[i].s = &(allstrings[i * slen]);
1252
- snprintf (thestrings[i].s , IDL_OutputFormatLenFunc (GDL_TYP_LONG), IDL_OutputFormatFunc (GDL_TYP_LONG) , i);
1259
+ thestrings[i].s = &(allstrings[i * ( slen+ 1 ) ]);
1260
+ snprintf (thestrings[i].s , slen+ 1 , fmt , i);
1253
1261
}
1254
1262
} else gdlInitVector (addr, type, l);
1255
1263
}
@@ -1295,7 +1303,7 @@ if (t->flags & GDL_V_ARR) {
1295
1303
if (zero) memset (&(v->value ),0 ,sizeof (EXPORT_ALLTYPES));
1296
1304
return (char *) &(v->value );
1297
1305
}
1298
- throw ;
1306
+ return NULL ;
1299
1307
}
1300
1308
1301
1309
DLL_PUBLIC EXPORT_VPTR GDL_CDECL IDL_Gettmp (void ){TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__)
@@ -2379,15 +2387,15 @@ DLL_PUBLIC void * GDL_CDECL IDL_MemRealloc(void *ptr, EXPORT_MEMINT n, const cha
2379
2387
2380
2388
DLL_PUBLIC void GDL_CDECL IDL_MemFree (GDL_REGISTER void *m, const char *err_str, int msg_action){free (m);}
2381
2389
2382
- DLL_PUBLIC void * GDL_CDECL IDL_MemAllocPerm (EXPORT_MEMINT n, const char *err_str, int action){TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__) GDL_WillThrowAfterCleaning (" MemAllocPerm is not currently supported." );throw ;}
2390
+ DLL_PUBLIC void * GDL_CDECL IDL_MemAllocPerm (EXPORT_MEMINT n, const char *err_str, int action){TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__) GDL_WillThrowAfterCleaning (" MemAllocPerm is not currently supported." );return NULL ;}
2383
2391
2384
2392
DLL_PUBLIC char * GDL_CDECL IDL_GetScratch (GDL_REGISTER EXPORT_VPTR *p, GDL_REGISTER EXPORT_MEMINT n_elts, GDL_REGISTER EXPORT_MEMINT elt_size){ TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__) return (char *)malloc (n_elts*elt_size);}
2385
2393
2386
2394
DLL_PUBLIC void GDL_CDECL GDL_KWCleanup (int fcn){TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__) IDL_KWFree ();}
2387
2395
2388
2396
DLL_PUBLIC char * GDL_CDECL IDL_GetScratchOnThreshold (GDL_REGISTER char *auto_buf, GDL_REGISTER EXPORT_MEMINT auto_elts, GDL_REGISTER EXPORT_MEMINT n_elts, GDL_REGISTER EXPORT_MEMINT elt_size, EXPORT_VPTR *tempvar){TRACE_ROUTINE (__FUNCTION__,__FILE__,__LINE__)
2389
2397
GDL_WillThrowAfterCleaning (" IDL_GetScratchOnThreshold is not implemented, FIXME." );
2390
- throw ;
2398
+ return NULL ;
2391
2399
}
2392
2400
2393
2401
EXPORT_TERMINFO IDL_TermInfo={
0 commit comments