Commit ee9aad5f5798b938fa6f3ebbb7ada6d47678a95e

Authored by perry.werneck@gmail.com
1 parent f4f81190

Correcao na conversao de codepage em windows

Showing 1 changed file with 26 additions and 13 deletions   Show diff stats
util.c
... ... @@ -160,16 +160,9 @@ LIB3270_EXPORT const char * lib3270_win32_strerror(int e)
160 160 return buffer;
161 161 }
162 162  
163   - trace("%s",buffer);
164   -
165 163 #ifdef HAVE_ICONV
166 164 {
167 165 // Convert from windows codepage to UTF-8 pw3270´s default charset
168   - char tmpbuffer[4096];
169   - size_t in = strlen(buffer);
170   - size_t out = 4095;
171   - char * ptr = tmpbuffer;
172   -
173 166 iconv_t hConv = iconv_open("UTF-8",lib3270_win32_local_charset());
174 167  
175 168 trace("[%s]",buffer);
... ... @@ -178,23 +171,43 @@ LIB3270_EXPORT const char * lib3270_win32_strerror(int e)
178 171 {
179 172 lib3270_write_log(NULL,"iconv","%s: Error creating charset conversion",__FUNCTION__);
180 173 }
181   - else if(iconv(hConv,(const char **) &buffer,&in,&ptr,&out) != ((size_t) -1))
  174 + else
182 175 {
183   - // strncpy(buffer,tmpbuffer,4096);
184   - }
  176 + size_t in = strlen(buffer);
  177 + size_t out = (in << 1);
  178 + char * ptr;
  179 + char * outBuffer = (char *) malloc(out);
  180 + ICONV_CONST char * inBuffer = (ICONV_CONST char *) buffer;
185 181  
186   - trace("[%s]",buffer);
  182 + memset(ptr=outBuffer,0,out);
  183 +
  184 + iconv(hConv,NULL,NULL,NULL,NULL); // Reset state
  185 +
  186 + if(iconv(hConv,&inBuffer,&in,&ptr,&out) != ((size_t) -1))
  187 + {
  188 + strncpy(buffer,outBuffer,4095);
  189 + }
  190 +
  191 + free(outBuffer);
  192 +
  193 + iconv_close(hConv);
  194 + }
187 195  
188   - iconv_close(hConv);
189 196 }
190 197 #endif // HAVE_ICONV
191 198  
192   - trace("[%s]",buffer);
193 199 return buffer;
194 200 }
195 201  
196 202 LIB3270_EXPORT const char * lib3270_win32_local_charset(void)
197 203 {
  204 + // Reference:
  205 + // http://msdn.microsoft.com/en-us/library/windows/desktop/dd318070(v=vs.85).aspx
  206 +
  207 + #warning TODO: Use GetACP() to identify the correct code page
  208 +
  209 + trace("Windows CHARSET is %u",GetACP());
  210 +
198 211 return "CP1252";
199 212 }
200 213  
... ...