Fixes #23 using call_iconv wrapper
This commit is contained in:
		
							parent
							
								
									5f6a5a4f00
								
							
						
					
					
						commit
						072063d01b
					
				
							
								
								
									
										13
									
								
								converter.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								converter.go
									
									
									
									
									
								
							@ -6,6 +6,13 @@ package iconv
 | 
				
			|||||||
#cgo windows LDFLAGS: -liconv
 | 
					#cgo windows LDFLAGS: -liconv
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <iconv.h>
 | 
					#include <iconv.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// As of GO 1.6 passing a pointer to Go pointer, will lead to panic
 | 
				
			||||||
 | 
					// Therofore we use this wrapper function, to avoid passing **char directly from go
 | 
				
			||||||
 | 
					size_t call_iconv(iconv_t ctx, char *in, size_t *size_in, char *out, size_t *size_out){
 | 
				
			||||||
 | 
						return iconv(ctx, &in, size_in, &out, size_out);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
import "C"
 | 
					import "C"
 | 
				
			||||||
import "syscall"
 | 
					import "syscall"
 | 
				
			||||||
@ -80,7 +87,7 @@ func (this *Converter) Convert(input []byte, output []byte) (bytesRead int, byte
 | 
				
			|||||||
			inputPointer := (*C.char)(unsafe.Pointer(&input[0]))
 | 
								inputPointer := (*C.char)(unsafe.Pointer(&input[0]))
 | 
				
			||||||
			outputPointer := (*C.char)(unsafe.Pointer(&output[0]))
 | 
								outputPointer := (*C.char)(unsafe.Pointer(&output[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			_, err = C.iconv(this.context, &inputPointer, &inputLeft, &outputPointer, &outputLeft)
 | 
								_, err = C.call_iconv(this.context, inputPointer, &inputLeft, outputPointer, &outputLeft)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// update byte counters
 | 
								// update byte counters
 | 
				
			||||||
			bytesRead = len(input) - int(inputLeft)
 | 
								bytesRead = len(input) - int(inputLeft)
 | 
				
			||||||
@ -89,13 +96,13 @@ func (this *Converter) Convert(input []byte, output []byte) (bytesRead int, byte
 | 
				
			|||||||
			// inputPointer will be nil, outputPointer is generated as above
 | 
								// inputPointer will be nil, outputPointer is generated as above
 | 
				
			||||||
			outputPointer := (*C.char)(unsafe.Pointer(&output[0]))
 | 
								outputPointer := (*C.char)(unsafe.Pointer(&output[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			_, err = C.iconv(this.context, nil, &inputLeft, &outputPointer, &outputLeft)
 | 
								_, err = C.call_iconv(this.context, nil, &inputLeft, outputPointer, &outputLeft)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// update write byte counter
 | 
								// update write byte counter
 | 
				
			||||||
			bytesWritten = len(output) - int(outputLeft)
 | 
								bytesWritten = len(output) - int(outputLeft)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			// both input and output are zero length, do a shift state reset
 | 
								// both input and output are zero length, do a shift state reset
 | 
				
			||||||
			_, err = C.iconv(this.context, nil, &inputLeft, nil, &outputLeft)
 | 
								_, err = C.call_iconv(this.context, nil, &inputLeft, nil, &outputLeft)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		err = syscall.EBADF
 | 
							err = syscall.EBADF
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user