2626#include "ocdbutil.h"
2727#include "ocesql.h"
2828
29+ #define MAX_DIGITS 38
30+
2931typedef struct sql_var {
3032 int type ; // set OCDB_TYPE_*
3133 int length ; // size
@@ -2767,12 +2769,7 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
27672769
27682770 int fillzero ;
27692771 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 };
27762773
27772774 // before decimal point
27782775 int beforedp = 0 ;
@@ -2813,7 +2810,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
28132810 }
28142811
28152812 memcpy (addr , final , sv -> length );
2816- free (final );
28172813 break ;
28182814 }
28192815 case OCDB_TYPE_SIGNED_NUMBER_TC :
@@ -2824,14 +2820,9 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
28242820
28252821 int fillzero ;
28262822 int zcount ;
2827- char * final ;
2828- int finalbuflen ;
2823+ char final [MAX_DIGITS + SIGN_LENGTH + 1 + TERMINAL_LENGTH ] = {0 };
28292824 int final_length ;
28302825
2831- // fill zero
2832- finalbuflen = sv -> length ;
2833- final = (char * )calloc (finalbuflen , sizeof (char ));
2834-
28352826 if (retstr [0 ] == '-' ){
28362827 is_negative = true;
28372828 value = retstr + 1 ;
@@ -2883,7 +2874,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
28832874 }
28842875
28852876 memcpy (addr , final , sv -> length );
2886- free (final );
28872877 break ;
28882878 }
28892879 case OCDB_TYPE_SIGNED_NUMBER_LS :
@@ -2893,12 +2883,7 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
28932883
28942884 int fillzero ;
28952885 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 };
29022887
29032888 if (retstr [0 ] == '-' ){
29042889 final [0 ] = '-' ;
@@ -2947,7 +2932,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
29472932 }
29482933
29492934 memcpy (addr , final , sv -> length + SIGN_LENGTH );
2950- free (final );
29512935 break ;
29522936 }
29532937 case OCDB_TYPE_UNSIGNED_NUMBER_PD :
@@ -2958,9 +2942,9 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
29582942
29592943 int fillzero ;
29602944 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 ] ;
29642948
29652949 int i ;
29662950 unsigned char ubit = 0xF0 ;
@@ -2969,9 +2953,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
29692953 const int dlength = (sv -> length / 2 ) + 1 ;
29702954 const int skip_first = (sv -> length + 1 ) % 2 ; // 1 -> skip first 4 bits
29712955
2972- pre_final_len = sv -> length + TERMINAL_LENGTH ;
2973- pre_final = (char * )calloc (pre_final_len , sizeof (char ));
2974-
29752956 // before decimal point
29762957 int beforedp = 0 ;
29772958 for (ptr = value ; * ptr != '\0' ; ptr ++ ){
@@ -3010,7 +2991,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
30102991 }
30112992
30122993 // format setting
3013- final = (char * )calloc ((int )dlength + TERMINAL_LENGTH , sizeof (char ));
30142994 ptr = pre_final ;
30152995 for (i = 0 ; i < dlength ; i ++ ){
30162996 unsigned char vubit = 0x00 ;
@@ -3035,9 +3015,7 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
30353015 final [i ] = vubit | vlbit ;
30363016 }
30373017
3038- memcpy (addr , final , (int )dlength );
3039- free (pre_final );
3040- free (final );
3018+ memcpy (addr , final , dlength );
30413019 break ;
30423020 }
30433021 case OCDB_TYPE_SIGNED_NUMBER_PD :
@@ -3048,9 +3026,9 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
30483026
30493027 int fillzero ;
30503028 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 ] ;
30543032
30553033 int i ;
30563034 unsigned char ubit = 0xF0 ;
@@ -3066,9 +3044,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
30663044 value = retstr ;
30673045 }
30683046
3069- pre_final_len = (int )dlength + TERMINAL_LENGTH ;
3070- pre_final = (char * )calloc (pre_final_len , sizeof (char ));
3071-
30723047 // before decimal point
30733048 int beforedp = 0 ;
30743049 for (ptr = value ; * ptr != '\0' ; ptr ++ ){
@@ -3107,7 +3082,6 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
31073082 }
31083083
31093084 // format setting
3110- final = (char * )calloc ((int )dlength + TERMINAL_LENGTH , sizeof (char ));
31113085 ptr = pre_final ;
31123086 for (i = 0 ; i < dlength ; i ++ ){
31133087 unsigned char vubit = 0x00 ;
@@ -3136,65 +3110,75 @@ create_coboldata(SQLVAR *sv, int index, char *retstr){
31363110 final [i ] = vubit | vlbit ;
31373111 }
31383112
3139- memcpy (addr , final , (int )dlength );
3140- free (pre_final );
3141- free (final );
3113+ memcpy (addr , final , dlength );
31423114 break ;
31433115 }
3144- case OCDB_TYPE_ALPHANUMERIC :
3116+ case OCDB_TYPE_ALPHANUMERIC : {
31453117 // 文字の長さだけメモリコピー
3146- if (strlen (retstr ) >= sv -> length ){
3118+ const size_t rlen = strlen (retstr );
3119+ if (rlen >= sv -> length ){
31473120 memcpy (addr , retstr , sv -> length );
31483121 }else {
3149- memset (addr ,' ' , sv -> length );
3150- memcpy (addr , retstr , strlen ( retstr ) );
3122+ memcpy (addr ,retstr , rlen );
3123+ memset (addr + rlen , ' ' , sv -> length - rlen );
31513124 }
31523125 break ;
3153- case OCDB_TYPE_JAPANESE :
3126+ }
3127+ case OCDB_TYPE_JAPANESE : {
31543128 // 文字の長さだけメモリコピー
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 );
31573133 }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 ){
31613139 tmp [i ] = 0x81 ;
31623140 tmp [i + 1 ] = 0x40 ;
31633141 }
3164- memcpy (addr ,retstr ,strlen (retstr ));
31653142 }
31663143 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 ){
31693148 tmp_len = sv -> length ;
31703149 memcpy (addr , & tmp_len , OCDB_VARCHAR_HEADER_BYTE );
31713150 memcpy ((char * )addr + OCDB_VARCHAR_HEADER_BYTE , retstr , sv -> length );
31723151 } else {
3173- tmp_len = strlen ( retstr ) ;
3152+ tmp_len = rlen ;
31743153 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 );
31773156 }
31783157 LOG ("VARYING-LEN:%d\n" ,tmp_len );
31793158 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 ){
31823164 tmp_len = sv -> length ;
31833165 memcpy (addr , & tmp_len , OCDB_VARCHAR_HEADER_BYTE );
3184- memcpy (addr , retstr , sv -> length * 2 );
3185- }else {
3166+ memcpy (addr , retstr , memlen );
3167+ } else {
31863168 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 ){
31893175 tmp [i ] = 0x81 ;
31903176 tmp [i + 1 ] = 0x40 ;
31913177 }
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 );
31953178 }
31963179 LOG ("VARYING-LEN:%d\n" ,tmp_len );
31973180 break ;
3181+ }
31983182 default :
31993183 break ;
32003184 }
0 commit comments