LCD电子书项目(五)

来源:互联网 发布:linux 编译tar.gz 编辑:程序博客网 时间:2024/05/16 10:44

encoding目录下结构如下:


Makefile文件

<span style="font-size:18px;"><span style="font-size:18px;">obj-y += ascii.oobj-y += encoding_manager.oobj-y += utf-16be.oobj-y += utf-16le.oobj-y += utf-8.o  </span></span>

encoding_manager.h文件

<span style="font-size:18px;">#ifndef _ENCODING_MANAGER_H#define _ENCODING_MANAGER_H#include <fonts_manager.h>#include <disp_manager.h>typedef struct EncodingOpr {char *name;int iHeadLen;PT_FontOpr ptFontOprSupportedHead;int (*isSupport)(unsigned char *pucBufHead);int (*GetCodeFrmBuf)(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);struct EncodingOpr *ptNext;}T_EncodingOpr, *PT_EncodingOpr;int RegisterEncodingOpr(PT_EncodingOpr ptEncodingOpr);void ShowEncodingOpr(void);PT_DispOpr GetDispOpr(char *pcName);PT_EncodingOpr SelectEncodingOprForFile(unsigned char *pucFileBufHead);int AddFontOprForEncoding(PT_EncodingOpr ptEncodingOpr, PT_FontOpr ptFontOpr);int DelFontOprFrmEncoding(PT_EncodingOpr ptEncodingOpr, PT_FontOpr ptFontOpr);int EncodingInit(void);int AsciiEncodingInit(void);int  Utf16beEncodingInit(void);int  Utf16leEncodingInit(void);int  Utf8EncodingInit(void);#endif /* _ENCODING_MANAGER_H */</span>


encoding_manager.c文件

<span style="font-size:18px;"><span style="font-size:18px;">#include <config.h>#include <encoding_manager.h>#include <string.h>#include <stdlib.h>static PT_EncodingOpr g_ptEncodingOprHead;int RegisterEncodingOpr(PT_EncodingOpr ptEncodingOpr){PT_EncodingOpr ptTmp;if (!g_ptEncodingOprHead){g_ptEncodingOprHead   = ptEncodingOpr;ptEncodingOpr->ptNext = NULL;}else{ptTmp = g_ptEncodingOprHead;while (ptTmp->ptNext){ptTmp = ptTmp->ptNext;}ptTmp->ptNext      = ptEncodingOpr;ptEncodingOpr->ptNext = NULL;}return 0;}void ShowEncodingOpr(void){int i = 0;PT_EncodingOpr ptTmp = g_ptEncodingOprHead;while (ptTmp){printf("%02d %s\n", i++, ptTmp->name);ptTmp = ptTmp->ptNext;}}PT_EncodingOpr SelectEncodingOprForFile(unsigned char *pucFileBufHead){PT_EncodingOpr ptTmp = g_ptEncodingOprHead;while (ptTmp){if (ptTmp->isSupport(pucFileBufHead))return ptTmp;elseptTmp = ptTmp->ptNext;}return NULL;}int AddFontOprForEncoding(PT_EncodingOpr ptEncodingOpr, PT_FontOpr ptFontOpr){PT_FontOpr ptFontOprCpy;if (!ptEncodingOpr || !ptFontOpr){return -1;}else{ptFontOprCpy = malloc(sizeof(T_FontOpr));if (!ptFontOprCpy){return -1;}else{memcpy(ptFontOprCpy, ptFontOpr, sizeof(T_FontOpr));ptFontOprCpy->ptNext = ptEncodingOpr->ptFontOprSupportedHead;ptEncodingOpr->ptFontOprSupportedHead = ptFontOprCpy;return 0;}}}int DelFontOprFrmEncoding(PT_EncodingOpr ptEncodingOpr, PT_FontOpr ptFontOpr){PT_FontOpr ptTmp;PT_FontOpr ptPre;if (!ptEncodingOpr || !ptFontOpr){return -1;}else{ptTmp = ptEncodingOpr->ptFontOprSupportedHead;if (strcmp(ptTmp->name, ptFontOpr->name) == 0){/* 删除头节点 */ptEncodingOpr->ptFontOprSupportedHead = ptTmp->ptNext;free(ptTmp);return 0;}ptPre = ptEncodingOpr->ptFontOprSupportedHead;ptTmp = ptPre->ptNext;while (ptTmp){if (strcmp(ptTmp->name, ptFontOpr->name) == 0){/* 从链表里取出、释放 */ptPre->ptNext = ptTmp->ptNext;free(ptTmp);return 0;}else{ptPre = ptTmp;ptTmp = ptTmp->ptNext;}}return -1;}}int EncodingInit(void){int iError;iError = AsciiEncodingInit();if (iError){DBG_PRINTF("AsciiEncodingInit error!\n");return -1;}iError = Utf16leEncodingInit();if (iError){DBG_PRINTF("Utf16leEncodingInit error!\n");return -1;}iError = Utf16beEncodingInit();if (iError){DBG_PRINTF("Utf16beEncodingInit error!\n");return -1;}iError = Utf8EncodingInit();if (iError){DBG_PRINTF("Utf8EncodingInit error!\n");return -1;}return 0;}</span></span>


下面四个文件都是不同字体格式的解析

ascii.c文件

<span style="font-size:18px;"><span style="font-size:18px;">#include <config.h>#include <encoding_manager.h>#include <string.h>static int isAsciiCoding(unsigned char *pucBufHead);static int AsciiGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);static T_EncodingOpr g_tAsciiEncodingOpr = {.name          = "ascii",.iHeadLen      = 0,.isSupport     = isAsciiCoding,.GetCodeFrmBuf = AsciiGetCodeFrmBuf,};static int isAsciiCoding(unsigned char *pucBufHead){const char aStrUtf8[]    = {0xEF, 0xBB, 0xBF, 0};const char aStrUtf16le[] = {0xFF, 0xFE, 0};const char aStrUtf16be[] = {0xFE, 0xFF, 0};if (strncmp((const char*)pucBufHead, aStrUtf8, 3) == 0){/* UTF-8 */return 0;}else if (strncmp((const char*)pucBufHead, aStrUtf16le, 2) == 0){/* UTF-16 little endian */return 0;}else if (strncmp((const char*)pucBufHead, aStrUtf16be, 2) == 0){/* UTF-16 big endian */return 0;}else{return 1;}}static int AsciiGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode){unsigned char *pucBuf = pucBufStart;unsigned char c = *pucBuf;if ((pucBuf < pucBufEnd) && (c < (unsigned char)0x80)){/* 返回ASCII码 */*pdwCode = (unsigned int)c;return 1;}if (((pucBuf + 1) < pucBufEnd) && (c >= (unsigned char)0x80)){/* 返回GBK码 */*pdwCode = pucBuf[0] + (((unsigned int)pucBuf[1])<<8);return 2;}if (pucBuf < pucBufEnd){/* 可能文件有损坏, 但是还是返回一个码, 即使它是错误的 */*pdwCode = (unsigned int)c;return 1;}else{/* 文件处理完毕 */return 0;}}int AsciiEncodingInit(void){AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("freetype"));AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("ascii"));AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("gbk"));return RegisterEncodingOpr(&g_tAsciiEncodingOpr);}</span></span>


utf-8.c文件

<span style="font-size:18px;"><span style="font-size:18px;">#include <config.h>#include <encoding_manager.h>#include <string.h>static int isUtf8Coding(unsigned char *pucBufHead);static int Utf8GetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);static T_EncodingOpr g_tUtf8EncodingOpr = {.name          = "utf-8",.iHeadLen   = 3,.isSupport     = isUtf8Coding,.GetCodeFrmBuf = Utf8GetCodeFrmBuf,};static int isUtf8Coding(unsigned char *pucBufHead){const char aStrUtf8[]    = {0xEF, 0xBB, 0xBF, 0};if (strncmp((const char*)pucBufHead, aStrUtf8, 3) == 0){/* UTF-8 */return 1;}else{return 0;}}/* 获得前导为1的位的个数 * 比如二进制数 11001111 的前导1有2位 *              11100001 的前导1有3位 */static int GetPreOneBits(unsigned char ucVal){int i;int j = 0;for (i = 7; i >= 0; i--){if (!(ucVal & (1<<i)))break;elsej++;}return j;}static int Utf8GetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode){#if 0    对于UTF-8编码中的任意字节B,如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符;    如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的一个字节,并且不为字符的第一个字节编码;    如果B的前两位为1,第三位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由两个字节表示;    如果B的前三位为1,第四位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示;    如果B的前四位为1,第五位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示;    因此,对UTF-8编码中的任意字节,根据第一位,可判断是否为ASCII字符;    根据前二位,可判断该字节是否为一个字符编码的第一个字节;     根据前四位(如果前两位均为1),可确定该字节为字符编码的第一个字节,并且可判断对应的字符由几个字节表示;    根据前五位(如果前四位为1),可判断编码是否有错误或数据传输过程中是否有错误。#endifint i;int iNum;unsigned char ucVal;unsigned int dwSum = 0;if (pucBufStart >= pucBufEnd){/* 文件结束 */return 0;}ucVal = pucBufStart[0];iNum  = GetPreOneBits(pucBufStart[0]);if ((pucBufStart + iNum) > pucBufEnd){/* 文件结束 */return 0;}if (iNum == 0){/* ASCII */*pdwCode = pucBufStart[0];return 1;}else{ucVal = ucVal << iNum;ucVal = ucVal >> iNum;dwSum += ucVal;for (i = 1; i < iNum; i++){ucVal = pucBufStart[i] & 0x3f;dwSum = dwSum << 6;dwSum += ucVal;}*pdwCode = dwSum;return iNum;}}int  Utf8EncodingInit(void){AddFontOprForEncoding(&g_tUtf8EncodingOpr, GetFontOpr("freetype"));AddFontOprForEncoding(&g_tUtf8EncodingOpr, GetFontOpr("ascii"));return RegisterEncodingOpr(&g_tUtf8EncodingOpr);}</span></span>


utf-16be.c文件

<span style="font-size:18px;"><span style="font-size:18px;">#include <config.h>#include <encoding_manager.h>#include <string.h>static int isUtf16beCoding(unsigned char *pucBufHead);static int Utf16beGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);static T_EncodingOpr g_tUtf16beEncodingOpr = {.name          = "utf-16be",.iHeadLen   = 2,.isSupport     = isUtf16beCoding,.GetCodeFrmBuf = Utf16beGetCodeFrmBuf,};static int isUtf16beCoding(unsigned char *pucBufHead){const char aStrUtf16be[] = {0xFE, 0xFF, 0};if (strncmp((const char*)pucBufHead, aStrUtf16be, 2) == 0){/* UTF-16 big endian */return 1;}else{return 0;}}static int Utf16beGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode){if (pucBufStart + 1 < pucBufEnd){*pdwCode = (((unsigned int)pucBufStart[0])<<8) + pucBufStart[1];return 2;}else{/* 文件结束 */return 0;}}int  Utf16beEncodingInit(void){AddFontOprForEncoding(&g_tUtf16beEncodingOpr, GetFontOpr("freetype"));AddFontOprForEncoding(&g_tUtf16beEncodingOpr, GetFontOpr("ascii"));return RegisterEncodingOpr(&g_tUtf16beEncodingOpr);}</span></span>


utf-16le.c文件

<span style="font-size:18px;"><span style="font-size:18px;">#include <config.h>#include <encoding_manager.h>#include <string.h>static int isUtf16leCoding(unsigned char *pucBufHead);static int Utf16leGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);static T_EncodingOpr g_tUtf16leEncodingOpr = {.name          = "utf-16le",.iHeadLen   = 2,.isSupport     = isUtf16leCoding,.GetCodeFrmBuf = Utf16leGetCodeFrmBuf,};static int isUtf16leCoding(unsigned char *pucBufHead){const char aStrUtf16le[] = {0xFF, 0xFE, 0};if (strncmp((const char *)pucBufHead, aStrUtf16le, 2) == 0){/* UTF-16 little endian */return 1;}else{return 0;}}static int Utf16leGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode){if (pucBufStart + 1 < pucBufEnd){*pdwCode = (((unsigned int)pucBufStart[1])<<8) + pucBufStart[0];return 2;}else{/* 文件结束 */return 0;}}int  Utf16leEncodingInit(void){AddFontOprForEncoding(&g_tUtf16leEncodingOpr, GetFontOpr("freetype"));AddFontOprForEncoding(&g_tUtf16leEncodingOpr, GetFontOpr("ascii"));return RegisterEncodingOpr(&g_tUtf16leEncodingOpr);}</span></span>



0 0
原创粉丝点击