26
26
#include "ocdbutil.h"
27
27
#include "ocesql.h"
28
28
29
+ #define MAX_DIGITS 38
30
+
29
31
typedef struct sql_var {
30
32
int type ; // set OCDB_TYPE_*
31
33
int length ; // size
@@ -2767,12 +2769,7 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
2767
2769
2768
2770
int fillzero ;
2769
2771
int zcount ;
2770
- char * final ;
2771
- int finalbuflen ;
2772
-
2773
- // fill zero
2774
- finalbuflen = sv -> length + TERMINAL_LENGTH ;
2775
- final = (char * )calloc (finalbuflen , sizeof (char ));
2772
+ char final [MAX_DIGITS + 1 + TERMINAL_LENGTH ] = { 0 };
2776
2773
2777
2774
// before decimal point
2778
2775
int beforedp = 0 ;
@@ -2813,7 +2810,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
2813
2810
}
2814
2811
2815
2812
memcpy (addr , final , sv -> length );
2816
- free (final );
2817
2813
break ;
2818
2814
}
2819
2815
case OCDB_TYPE_SIGNED_NUMBER_TC :
@@ -2824,14 +2820,9 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
2824
2820
2825
2821
int fillzero ;
2826
2822
int zcount ;
2827
- char * final ;
2828
- int finalbuflen ;
2823
+ char final [MAX_DIGITS + SIGN_LENGTH + 1 + TERMINAL_LENGTH ] = {0 };
2829
2824
int final_length ;
2830
2825
2831
- // fill zero
2832
- finalbuflen = sv -> length ;
2833
- final = (char * )calloc (finalbuflen , sizeof (char ));
2834
-
2835
2826
if (retstr [0 ] == '-' ){
2836
2827
is_negative = true;
2837
2828
value = retstr + 1 ;
@@ -2883,7 +2874,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
2883
2874
}
2884
2875
2885
2876
memcpy (addr , final , sv -> length );
2886
- free (final );
2887
2877
break ;
2888
2878
}
2889
2879
case OCDB_TYPE_SIGNED_NUMBER_LS :
@@ -2893,12 +2883,7 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
2893
2883
2894
2884
int fillzero ;
2895
2885
int zcount ;
2896
- char * final ;
2897
- int finalbuflen ;
2898
-
2899
- // fill zero
2900
- finalbuflen = SIGN_LENGTH + sv -> length + TERMINAL_LENGTH ;
2901
- final = (char * )calloc (finalbuflen , sizeof (char ));
2886
+ char final [MAX_DIGITS + SIGN_LENGTH + 1 + TERMINAL_LENGTH ] = {0 };
2902
2887
2903
2888
if (retstr [0 ] == '-' ){
2904
2889
final [0 ] = '-' ;
@@ -2947,7 +2932,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
2947
2932
}
2948
2933
2949
2934
memcpy (addr , final , sv -> length + SIGN_LENGTH );
2950
- free (final );
2951
2935
break ;
2952
2936
}
2953
2937
case OCDB_TYPE_UNSIGNED_NUMBER_PD :
@@ -2958,9 +2942,9 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
2958
2942
2959
2943
int fillzero ;
2960
2944
int zcount ;
2961
- char * pre_final ;
2962
- int pre_final_len ;
2963
- char * final ;
2945
+
2946
+ char pre_final [ MAX_DIGITS ] ;
2947
+ char final [( MAX_DIGITS + 1 ) / 2 ] ;
2964
2948
2965
2949
int i ;
2966
2950
unsigned char ubit = 0xF0 ;
@@ -2969,9 +2953,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
2969
2953
const int dlength = (sv -> length / 2 ) + 1 ;
2970
2954
const int skip_first = (sv -> length + 1 ) % 2 ; // 1 -> skip first 4 bits
2971
2955
2972
- pre_final_len = sv -> length + TERMINAL_LENGTH ;
2973
- pre_final = (char * )calloc (pre_final_len , sizeof (char ));
2974
-
2975
2956
// before decimal point
2976
2957
int beforedp = 0 ;
2977
2958
for (ptr = value ; * ptr != '\0' ; ptr ++ ){
@@ -3010,7 +2991,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
3010
2991
}
3011
2992
3012
2993
// format setting
3013
- final = (char * )calloc ((int )dlength + TERMINAL_LENGTH , sizeof (char ));
3014
2994
ptr = pre_final ;
3015
2995
for (i = 0 ; i < dlength ; i ++ ){
3016
2996
unsigned char vubit = 0x00 ;
@@ -3035,9 +3015,7 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
3035
3015
final [i ] = vubit | vlbit ;
3036
3016
}
3037
3017
3038
- memcpy (addr , final , (int )dlength );
3039
- free (pre_final );
3040
- free (final );
3018
+ memcpy (addr , final , dlength );
3041
3019
break ;
3042
3020
}
3043
3021
case OCDB_TYPE_SIGNED_NUMBER_PD :
@@ -3048,9 +3026,9 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
3048
3026
3049
3027
int fillzero ;
3050
3028
int zcount ;
3051
- char * pre_final ;
3052
- int pre_final_len ;
3053
- char * final ;
3029
+
3030
+ char pre_final [ MAX_DIGITS ] ;
3031
+ char final [( MAX_DIGITS + 1 ) / 2 ] ;
3054
3032
3055
3033
int i ;
3056
3034
unsigned char ubit = 0xF0 ;
@@ -3066,9 +3044,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
3066
3044
value = retstr ;
3067
3045
}
3068
3046
3069
- pre_final_len = (int )dlength + TERMINAL_LENGTH ;
3070
- pre_final = (char * )calloc (pre_final_len , sizeof (char ));
3071
-
3072
3047
// before decimal point
3073
3048
int beforedp = 0 ;
3074
3049
for (ptr = value ; * ptr != '\0' ; ptr ++ ){
@@ -3107,7 +3082,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
3107
3082
}
3108
3083
3109
3084
// format setting
3110
- final = (char * )calloc ((int )dlength + TERMINAL_LENGTH , sizeof (char ));
3111
3085
ptr = pre_final ;
3112
3086
for (i = 0 ; i < dlength ; i ++ ){
3113
3087
unsigned char vubit = 0x00 ;
@@ -3136,65 +3110,75 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
3136
3110
final [i ] = vubit | vlbit ;
3137
3111
}
3138
3112
3139
- memcpy (addr , final , (int )dlength );
3140
- free (pre_final );
3141
- free (final );
3113
+ memcpy (addr , final , dlength );
3142
3114
break ;
3143
3115
}
3144
- case OCDB_TYPE_ALPHANUMERIC :
3116
+ case OCDB_TYPE_ALPHANUMERIC : {
3145
3117
// 文字の長さだけメモリコピー
3146
- if (strlen (retstr ) >= sv -> length ){
3118
+ const size_t rlen = strlen (retstr );
3119
+ if (rlen >= sv -> length ){
3147
3120
memcpy (addr , retstr , sv -> length );
3148
3121
}else {
3149
- memset (addr ,' ' , sv -> length );
3150
- memcpy (addr , retstr , strlen ( retstr ) );
3122
+ memcpy (addr ,retstr , rlen );
3123
+ memset (addr + rlen , ' ' , sv -> length - rlen );
3151
3124
}
3152
3125
break ;
3153
- case OCDB_TYPE_JAPANESE :
3126
+ }
3127
+ case OCDB_TYPE_JAPANESE : {
3154
3128
// 文字の長さだけメモリコピー
3155
- if (strlen (retstr ) >= sv -> length * 2 ){
3156
- memcpy (addr , retstr , sv -> length * 2 );
3129
+ const size_t memlen = sv -> length * 2 ;
3130
+ const size_t rlen = strlen (retstr );
3131
+ if (rlen >= memlen ){
3132
+ memcpy (addr , retstr , memlen );
3157
3133
}else {
3158
- int i ;
3159
- char * tmp = (char * )addr ;
3160
- for (i = 0 ;i + 1 < sv -> length * 2 ;i = i + 2 ){
3134
+ size_t i ;
3135
+ char * tmp ;
3136
+ memcpy (addr ,retstr ,rlen );
3137
+ tmp = (char * )addr + rlen ;
3138
+ for (i = 0 ;i + 1 < (memlen - rlen );i = i + 2 ){
3161
3139
tmp [i ] = 0x81 ;
3162
3140
tmp [i + 1 ] = 0x40 ;
3163
3141
}
3164
- memcpy (addr ,retstr ,strlen (retstr ));
3165
3142
}
3166
3143
break ;
3167
- case OCDB_TYPE_ALPHANUMERIC_VARYING :
3168
- if (strlen (retstr ) >= sv -> length ){
3144
+ }
3145
+ case OCDB_TYPE_ALPHANUMERIC_VARYING : {
3146
+ const size_t rlen = strlen (retstr );
3147
+ if (rlen >= sv -> length ){
3169
3148
tmp_len = sv -> length ;
3170
3149
memcpy (addr , & tmp_len , OCDB_VARCHAR_HEADER_BYTE );
3171
3150
memcpy ((char * )addr + OCDB_VARCHAR_HEADER_BYTE , retstr , sv -> length );
3172
3151
} else {
3173
- tmp_len = strlen ( retstr ) ;
3152
+ tmp_len = rlen ;
3174
3153
memcpy (addr , & tmp_len , OCDB_VARCHAR_HEADER_BYTE );
3175
- memset ((char * )addr + OCDB_VARCHAR_HEADER_BYTE ,' ' , sv -> length );
3176
- memcpy ((char * )addr + OCDB_VARCHAR_HEADER_BYTE , retstr , strlen ( retstr ) );
3154
+ memcpy ((char * )addr + OCDB_VARCHAR_HEADER_BYTE ,retstr , rlen );
3155
+ memset ((char * )addr + OCDB_VARCHAR_HEADER_BYTE + rlen , ' ' , sv -> length - rlen );
3177
3156
}
3178
3157
LOG ("VARYING-LEN:%d\n" ,tmp_len );
3179
3158
break ;
3180
- case OCDB_TYPE_JAPANESE_VARYING :
3181
- if (strlen (retstr ) >= sv -> length * 2 ){
3159
+ }
3160
+ case OCDB_TYPE_JAPANESE_VARYING : {
3161
+ const size_t memlen = sv -> length * 2 ;
3162
+ const size_t rlen = strlen (retstr );
3163
+ if (rlen >= memlen ){
3182
3164
tmp_len = sv -> length ;
3183
3165
memcpy (addr , & tmp_len , OCDB_VARCHAR_HEADER_BYTE );
3184
- memcpy (addr , retstr , sv -> length * 2 );
3185
- }else {
3166
+ memcpy (addr , retstr , memlen );
3167
+ } else {
3186
3168
int i ;
3187
- char * tmp = (char * )((char * )addr + OCDB_VARCHAR_HEADER_BYTE );
3188
- for (i = 0 ;i + 1 < sv -> length * 2 ;i = i + 2 ){
3169
+ char * tmp ;
3170
+ tmp_len = rlen /2 ;
3171
+ memcpy (addr , & tmp_len , OCDB_VARCHAR_HEADER_BYTE );
3172
+ memcpy ((char * )addr + OCDB_VARCHAR_HEADER_BYTE + rlen ,retstr ,rlen );
3173
+ tmp = (char * )((char * )addr + OCDB_VARCHAR_HEADER_BYTE + rlen );
3174
+ for (i = 0 ;i + 1 < (memlen - rlen );i = i + 2 ){
3189
3175
tmp [i ] = 0x81 ;
3190
3176
tmp [i + 1 ] = 0x40 ;
3191
3177
}
3192
- tmp_len = strlen (retstr )/2 ;
3193
- memcpy (addr , & tmp_len , OCDB_VARCHAR_HEADER_BYTE );
3194
- memcpy ((char * )addr + OCDB_VARCHAR_HEADER_BYTE ,retstr ,tmp_len * 2 );
3195
3178
}
3196
3179
LOG ("VARYING-LEN:%d\n" ,tmp_len );
3197
3180
break ;
3181
+ }
3198
3182
default :
3199
3183
break ;
3200
3184
}
0 commit comments