嵌入式系统多语言文本解决方案
case TXT_LANG_FRANCE:
strFile = TXT_FILE_FRANCE;
break;
case TXT_LANG_ITALY:
strFile = TXT_FILE_ITALY;
break;
case TXT_LANG_ARABIA:
strFile = TXT_FILE_ARABIA;
break;
case TXT_LANG_PORTUGAL:
strFile = TXT_FILE_PORTUGAL;
break;
case TXT_LANG_HINDI:
strFile = TXT_FILE_HINDI;
break;
case TXT_LANG_TURKISH:
strFile = TXT_FILE_TURKISH;
break;
case TXT_LANG_VIETNAM:
strFile = TXT_FILE_VIETNAM;
break;
case TXT_LANG_SWIDISH:
strFile = TXT_FILE_SWIDISH;
break;
case TXT_LANG_POLISH:
strFile = TXT_FILE_POLISH;
break;
default:
return NULL;
}
//打开配置文件并检查其格式
if ((fd = open(strFile, O_RDONLY)) == -1)
{
return NULL;
}
if (read(fd, fh, 16) != 16)
{
close(fd);
return NULL;
}
if (fh.lFileType != 0x4746432E || fh.lVersionNum != 0x32303156)
{
close(fd);
return NULL;
}
//在文本映射区内查找匹配的文本索引
for (iOff = fh.lMapOffset; iOff fh.lDataOffset; iOff += 8)
{
if (read(fd, map, 8) != 8)
{
close(fd);
return NULL;
}
if (map.wTextIndex == lIndex)
{
break;
}
}
if (iOff >= fh.lDataOffset)
{
close(fd);
return NULL;
}
//根据找到的文本映射来读取文本内容
if (!(pBuf = GuiMemAlloc(map.wTextSize + 2)))
{
close(fd);
return NULL;
}
lseek(fd, fh.lDataOffset + map.lTextOffset, SEEK_SET);
if (read(fd, pBuf, map.wTextSize) != map.wTextSize)
{
GuiMemFree(pBuf);
close(fd);
return NULL;
}
pBuf[map.wTextSize >> 1] = 0;
//建立字符串对象
pTxt = CreateStringDirect(pBuf);
GuiMemFree(pBuf);
close(fd);
return pTxt;
}
//定义与字符串相关的数据结构
#ifndef GUI_STRING_STRUCT
typedef struct _string
{
WORD wWidth; //字符串宽度,字符串输出时的总点阵宽度
WORD wLength; //字符串长度,不包括''
WORD * pContent; //字符串内容,以''结尾
} GUISTRING;
//结束与字符串相关的数据结构的定义
#define GUI_STRING_STRUCT
#endif
/***
* 功能:
根据指定的信息直接建立字符串,函数返回字符串指针
* 参数:
1.WORD * pContent: 字符串内容
* 返回:
成功返回字符串指针
失败返回NULL
* 备注:
***/
GUISTRING * CreateStringDirect(WORD * pContent)
{
GUISTRING * pStr;
//尝试为字符串分配内存
if (!(pStr = GuiMemAlloc(sizeof(GUISTRING))))
{
PRINT_INF(CreateStringDirect Err0!);
return NULL;
}
//字符串内容为空,建立一个空字符串对象
if (!pContent)
{
pStr->wWidth = 0;
pStr->wLength = 0;
pStr->pContent = NULL;
return pStr;
}
//统计字符串长度
pStr->wLength = 0;
pStr->pContent = pContent;
while (*pStr->pContent++)
{
pStr->wLength++;
}
//尝试为字符串内容分配内存
if (!(pStr->pContent = GuiMemAlloc((pStr->wLength + 1) 1)))
{
GuiMemFree(pStr);
PRINT_INF(CreateStringDirect Err1!);
return NULL;
}
//写入字符串内容
memcpy(pStr->pContent, pContent, (pStr->wLength + 1) 1);
//计算字符串宽度
if (_StringObjectFill(pStr))
{
GuiMemFree(pStr->pContent);
GuiMemFree(pStr);
PRINT_INF(CreateStringDirect Err2!);
return NULL;
}
return pStr;
}
- SN2005学习系统 数字语音室解决方案(05-19)
- 以可编程DSP架构应对TD-SCDMA以及TD-LTE带来的设计挑战 (02-14)
- 基于DSP的电源解决方案(06-13)
- FPGA PCIe 视频采集(Video Capture)解决方案分析(06-06)
- 大联大友尚集团推出基于Realtek的智能插座解决方案(10-22)
- Wind River携手Cavium推出新的多核软件解决方案(09-12)