Files
OpenTXW81X/sdk/app/zbar/zbar_iconv.c
T
2025-08-27 09:51:58 +01:00

118 lines
2.3 KiB
C

//#include "type.h"
#include "zbar.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <iconv.h>
#define FALSE_ERR ('Z' - 'A')
#define DIFF_VALUE ('a' - 'A')
int zbar_strcasecmp(char *s1, char *s2)
{
int ch1 = 0;
int ch2 = 0;
//参数判断
if(NULL == s1 || NULL == s2){
return FALSE_ERR;
}
//逐个字符查找比对,并记录差值
do{
if((ch1 = *((unsigned char *)s1++)) >= 'A' && ch1 <= 'Z'){
*s1 += DIFF_VALUE;
}
if((ch2 = *((unsigned char *)s2++)) >= 'A' && ch2 <= 'Z'){
*s2 += DIFF_VALUE;
}
}while(ch1 && ch1 == ch2);
return ch1 - ch2;
}
iconv_t zbar_iconv_open(const char *tocode, const char *fromcode){
int *cd;
//
cd = calloc(1, sizeof(16));
cd[0] = 0;
// printf("%s %s\r\n",__func__,fromcode);
if( ! zbar_strcasecmp( (char *)fromcode, "ISO8859-1" ) ){
cd[0] = 1;
}
if( ! zbar_strcasecmp( (char *)fromcode, "SJIS" ) ){
cd[0] = 2;
}
if( ! zbar_strcasecmp( (char *)fromcode, "UTF-8" ) ){
cd[0] = 3;
}
//printf("%s %d %d\r\n",__func__,__LINE__,cd[0]);
return cd;
}
size_t zbar_iconv(unsigned char* _cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft){
unsigned char *inb;
unsigned char *outb;
unsigned int inlen,outlen;
unsigned int itk = 0;
inb = (unsigned char *)*inbuf;
outb = (unsigned char *)*outbuf;
outlen = 0;
inlen = *inbytesleft;
//printf("%s %d %d\r\n",__func__,__LINE__,_cd[0]);
if(_cd[0] == 1){
for(itk = 0;itk < inlen;itk++){
if(inb[itk] < 0x80){
outb[outlen] = inb[itk];
outlen++;
}else{
outb[outlen] = (inb[itk]>>6)|0xc0;
outlen++;
outb[outlen] = (inb[itk]&0x3f)|0x80;
outlen++;
}
}
*inbuf = *inbuf + inlen;
*outbuf = *outbuf + outlen;
*outbytesleft = *outbytesleft - outlen;
*inbytesleft = 0;
return 0;
}else if(_cd[0] == 3){
memcpy(outb,inb,inlen);
//*outbytesleft = inlen;
*inbuf = *inbuf + inlen;
*outbuf = *outbuf + inlen;
*inbytesleft = 0;
*outbytesleft = *outbytesleft - inlen;
return 0;
}else{
printf("no iconv\r\n");
return -1;
}
//printf("%s %d\r\n",__func__,__LINE__);
}
int zbar_iconv_close(iconv_t _cd){
//printf("%s %d\r\n",__func__,__LINE__);
free(_cd);
//printf("%s %d\r\n",__func__,__LINE__);
return 0;
}