@@ -488,6 +488,7 @@ JSOBJ NpyArr_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
488
488
489
489
char * NpyArr_iterGetName (JSOBJ obj , JSONTypeContext * tc , size_t * outLen )
490
490
{
491
+ JSONObjectEncoder * enc = (JSONObjectEncoder * ) tc -> encoder ;
491
492
NpyArrContext * npyarr ;
492
493
npy_intp idx ;
493
494
PRINTMARK ();
@@ -496,13 +497,19 @@ char *NpyArr_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
496
497
{
497
498
idx = npyarr -> index [npyarr -> stridedim ] - 1 ;
498
499
* outLen = strlen (npyarr -> columnLabels [idx ]);
499
- return npyarr -> columnLabels [idx ];
500
+ memcpy (enc -> offset , npyarr -> columnLabels [idx ], sizeof (char )* (* outLen ));
501
+ enc -> offset += * outLen ;
502
+ * outLen = 0 ;
503
+ return NULL ;
500
504
}
501
505
else
502
506
{
503
507
idx = npyarr -> index [npyarr -> stridedim - npyarr -> inc ] - 1 ;
504
508
* outLen = strlen (npyarr -> rowLabels [idx ]);
505
- return npyarr -> rowLabels [idx ];
509
+ memcpy (enc -> offset , npyarr -> rowLabels [idx ], sizeof (char )* (* outLen ));
510
+ enc -> offset += * outLen ;
511
+ * outLen = 0 ;
512
+ return NULL ;
506
513
}
507
514
}
508
515
@@ -1064,7 +1071,7 @@ char** NpyArr_encodeLabels(PyArrayObject* labels, JSONObjectEncoder* enc, npy_in
1064
1071
// NOTE this function steals a reference to labels.
1065
1072
PyArrayObject * labelsTmp = NULL ;
1066
1073
PyObject * item = NULL ;
1067
- npy_intp i , stride , len ;
1074
+ npy_intp i , stride , len , need_quotes ;
1068
1075
char * * ret ;
1069
1076
char * dataptr , * cLabel , * origend , * origst , * origoffset ;
1070
1077
char labelBuffer [NPY_JSON_BUFSIZE ];
@@ -1117,15 +1124,8 @@ char** NpyArr_encodeLabels(PyArrayObject* labels, JSONObjectEncoder* enc, npy_in
1117
1124
break ;
1118
1125
}
1119
1126
1120
- // trim off any quotes surrounding the result
1121
- if (* cLabel == '\"' )
1122
- {
1123
- cLabel ++ ;
1124
- enc -> offset -= 2 ;
1125
- * (enc -> offset ) = '\0' ;
1126
- }
1127
-
1128
- len = enc -> offset - cLabel + 1 ;
1127
+ need_quotes = ((* cLabel ) != '"' );
1128
+ len = enc -> offset - cLabel + 1 + 2 * need_quotes ;
1129
1129
ret [i ] = PyObject_Malloc (sizeof (char )* len );
1130
1130
1131
1131
if (!ret [i ])
@@ -1135,7 +1135,18 @@ char** NpyArr_encodeLabels(PyArrayObject* labels, JSONObjectEncoder* enc, npy_in
1135
1135
break ;
1136
1136
}
1137
1137
1138
- memcpy (ret [i ], cLabel , sizeof (char )* len );
1138
+ if (need_quotes )
1139
+ {
1140
+ ret [i ][0 ] = '"' ;
1141
+ memcpy (ret [i ]+ 1 , cLabel , sizeof (char )* (len - 4 ));
1142
+ ret [i ][len - 3 ] = '"' ;
1143
+ }
1144
+ else
1145
+ {
1146
+ memcpy (ret [i ], cLabel , sizeof (char )* (len - 2 ));
1147
+ }
1148
+ ret [i ][len - 2 ] = ':' ;
1149
+ ret [i ][len - 1 ] = '\0' ;
1139
1150
dataptr += stride ;
1140
1151
}
1141
1152
0 commit comments