⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tclencoding.c

📁 tcl是工具命令语言
💻 C
📖 第 1 页 / 共 5 页
字号:
				 * output buffer. */{    int result;    result = TCL_OK;    dstLen -= TCL_UTF_MAX - 1;    if (dstLen < 0) {	dstLen = 0;    }    if (srcLen > dstLen) {	srcLen = dstLen;	result = TCL_CONVERT_NOSPACE;    }    *srcReadPtr = srcLen;    *dstWrotePtr = srcLen;    *dstCharsPtr = srcLen;    for ( ; --srcLen >= 0; ) {	*dst++ = *src++;    }    return result;}/* *------------------------------------------------------------------------- * * UtfToUtfProc -- * *	Convert from UTF-8 to UTF-8.  Note that the UTF-8 to UTF-8  *	translation is not a no-op, because it will turn a stream of *	improperly formed UTF-8 into a properly formed stream. * * Results: *	Returns TCL_OK if conversion was successful. * * Side effects: *	None. * *------------------------------------------------------------------------- */static int UtfToUtfProc(clientData, src, srcLen, flags, statePtr, dst, dstLen,	srcReadPtr, dstWrotePtr, dstCharsPtr)    ClientData clientData;	/* Not used. */    CONST char *src;		/* Source string in UTF-8. */    int srcLen;			/* Source string length in bytes. */    int flags;			/* Conversion control flags. */    Tcl_EncodingState *statePtr;/* Place for conversion routine to store				 * state information used during a piecewise				 * conversion.  Contents of statePtr are				 * initialized and/or reset by conversion				 * routine under control of flags argument. */    char *dst;			/* Output buffer in which converted string				 * is stored. */    int dstLen;			/* The maximum length of output buffer in				 * bytes. */    int *srcReadPtr;		/* Filled with the number of bytes from the				 * source string that were converted.  This				 * may be less than the original source length				 * if there was a problem converting some				 * source characters. */    int *dstWrotePtr;		/* Filled with the number of bytes that were				 * stored in the output buffer as a result of				 * the conversion. */    int *dstCharsPtr;		/* Filled with the number of characters that				 * correspond to the bytes stored in the				 * output buffer. */{    CONST char *srcStart, *srcEnd, *srcClose;    char *dstStart, *dstEnd;    int result, numChars;    Tcl_UniChar ch;    result = TCL_OK;        srcStart = src;    srcEnd = src + srcLen;    srcClose = srcEnd;    if ((flags & TCL_ENCODING_END) == 0) {	srcClose -= TCL_UTF_MAX;    }    dstStart = dst;    dstEnd = dst + dstLen - TCL_UTF_MAX;    for (numChars = 0; src < srcEnd; numChars++) {	if ((src > srcClose) && (!Tcl_UtfCharComplete(src, srcEnd - src))) {	    /*	     * If there is more string to follow, this will ensure that the	     * last UTF-8 character in the source buffer hasn't been cut off.	     */	    result = TCL_CONVERT_MULTIBYTE;	    break;	}	if (dst > dstEnd) {	    result = TCL_CONVERT_NOSPACE;	    break;	}	if (UCHAR(*src) < 0x80) {	    *dst++ = *src++;	} else {	    src += Tcl_UtfToUniChar(src, &ch);	    dst += Tcl_UniCharToUtf(ch, dst);	}    }    *srcReadPtr = src - srcStart;    *dstWrotePtr = dst - dstStart;    *dstCharsPtr = numChars;    return result;}/* *------------------------------------------------------------------------- * * UnicodeToUtfProc -- * *	Convert from Unicode to UTF-8. * * Results: *	Returns TCL_OK if conversion was successful. * * Side effects: *	None. * *------------------------------------------------------------------------- */static int UnicodeToUtfProc(clientData, src, srcLen, flags, statePtr, dst, dstLen,	srcReadPtr, dstWrotePtr, dstCharsPtr)    ClientData clientData;	/* Not used. */    CONST char *src;		/* Source string in Unicode. */    int srcLen;			/* Source string length in bytes. */    int flags;			/* Conversion control flags. */    Tcl_EncodingState *statePtr;/* Place for conversion routine to store				 * state information used during a piecewise				 * conversion.  Contents of statePtr are				 * initialized and/or reset by conversion				 * routine under control of flags argument. */    char *dst;			/* Output buffer in which converted string				 * is stored. */    int dstLen;			/* The maximum length of output buffer in				 * bytes. */    int *srcReadPtr;		/* Filled with the number of bytes from the				 * source string that were converted.  This				 * may be less than the original source length				 * if there was a problem converting some				 * source characters. */    int *dstWrotePtr;		/* Filled with the number of bytes that were				 * stored in the output buffer as a result of				 * the conversion. */    int *dstCharsPtr;		/* Filled with the number of characters that				 * correspond to the bytes stored in the				 * output buffer. */{    CONST Tcl_UniChar *wSrc, *wSrcStart, *wSrcEnd;    char *dstEnd, *dstStart;    int result, numChars;        result = TCL_OK;    if ((srcLen % sizeof(Tcl_UniChar)) != 0) {	result = TCL_CONVERT_MULTIBYTE;	srcLen /= sizeof(Tcl_UniChar);	srcLen *= sizeof(Tcl_UniChar);    }    wSrc = (Tcl_UniChar *) src;    wSrcStart = (Tcl_UniChar *) src;    wSrcEnd = (Tcl_UniChar *) (src + srcLen);    dstStart = dst;    dstEnd = dst + dstLen - TCL_UTF_MAX;    for (numChars = 0; wSrc < wSrcEnd; numChars++) {	if (dst > dstEnd) {	    result = TCL_CONVERT_NOSPACE;	    break;	}	/*	 * Special case for 1-byte utf chars for speed.	 */	if (*wSrc && *wSrc < 0x80) {	    *dst++ = (char) *wSrc;	} else {	    dst += Tcl_UniCharToUtf(*wSrc, dst);	}	wSrc++;    }    *srcReadPtr = (char *) wSrc - (char *) wSrcStart;    *dstWrotePtr = dst - dstStart;    *dstCharsPtr = numChars;    return result;}/* *------------------------------------------------------------------------- * * UtfToUnicodeProc -- * *	Convert from UTF-8 to Unicode. * * Results: *	Returns TCL_OK if conversion was successful. * * Side effects: *	None. * *------------------------------------------------------------------------- */static int UtfToUnicodeProc(clientData, src, srcLen, flags, statePtr, dst, dstLen,	srcReadPtr, dstWrotePtr, dstCharsPtr)    ClientData clientData;	/* TableEncodingData that specifies encoding. */    CONST char *src;		/* Source string in UTF-8. */    int srcLen;			/* Source string length in bytes. */    int flags;			/* Conversion control flags. */    Tcl_EncodingState *statePtr;/* Place for conversion routine to store				 * state information used during a piecewise				 * conversion.  Contents of statePtr are				 * initialized and/or reset by conversion				 * routine under control of flags argument. */    char *dst;			/* Output buffer in which converted string				 * is stored. */    int dstLen;			/* The maximum length of output buffer in				 * bytes. */    int *srcReadPtr;		/* Filled with the number of bytes from the				 * source string that were converted.  This				 * may be less than the original source length				 * if there was a problem converting some				 * source characters. */    int *dstWrotePtr;		/* Filled with the number of bytes that were				 * stored in the output buffer as a result of				 * the conversion. */    int *dstCharsPtr;		/* Filled with the number of characters that				 * correspond to the bytes stored in the				 * output buffer. */{    CONST char *srcStart, *srcEnd, *srcClose;    Tcl_UniChar *wDst, *wDstStart, *wDstEnd;    int result, numChars;        srcStart = src;    srcEnd = src + srcLen;    srcClose = srcEnd;    if ((flags & TCL_ENCODING_END) == 0) {	srcClose -= TCL_UTF_MAX;    }    wDst = (Tcl_UniChar *) dst;    wDstStart = (Tcl_UniChar *) dst;    wDstEnd = (Tcl_UniChar *) (dst + dstLen - sizeof(Tcl_UniChar));    result = TCL_OK;    for (numChars = 0; src < srcEnd; numChars++) {	if ((src > srcClose) && (!Tcl_UtfCharComplete(src, srcEnd - src))) {	    /*	     * If there is more string to follow, this will ensure that the	     * last UTF-8 character in the source buffer hasn't been cut off.	     */	    result = TCL_CONVERT_MULTIBYTE;	    break;	}	if (wDst > wDstEnd) {	    result = TCL_CONVERT_NOSPACE;	    break;        }	src += TclUtfToUniChar(src, wDst);	wDst++;    }    *srcReadPtr = src - srcStart;    *dstWrotePtr = (char *) wDst - (char *) wDstStart;    *dstCharsPtr = numChars;    return result;}/* *------------------------------------------------------------------------- * * TableToUtfProc -- * *	Convert from the encoding specified by the TableEncodingData into *	UTF-8. * * Results: *	Returns TCL_OK if conversion was successful. * * Side effects: *	None. * *------------------------------------------------------------------------- */static int TableToUtfProc(clientData, src, srcLen, flags, statePtr, dst, dstLen,	srcReadPtr, dstWrotePtr, dstCharsPtr)    ClientData clientData;	/* TableEncodingData that specifies				 * encoding. */    CONST char *src;		/* Source string in specified encoding. */    int srcLen;			/* Source string length in bytes. */    int flags;			/* Conversion control flags. */    Tcl_EncodingState *statePtr;/* Place for conversion routine to store				 * state information used during a piecewise				 * conversion.  Contents of statePtr are				 * initialized and/or reset by conversion				 * routine under control of flags argument. */    char *dst;			/* Output buffer in which converted string				 * is stored. */    int dstLen;			/* The maximum length of output buffer in				 * bytes. */    int *srcReadPtr;		/* Filled with the number of bytes from the				 * source string that were converted.  This				 * may be less than the original source length				 * if there was a problem converting some				 * source characters. */    int *dstWrotePtr;		/* Filled with the number of bytes that were				 * stored in the output buffer as a result of				 * the conversion. */    int *dstCharsPtr;		/* Filled with the number of characters that				 * correspond to the bytes stored in the				 * output buffer. */{    CONST char *srcStart, *srcEnd;    char *dstEnd, *dstStart, *prefixBytes;    int result, byte, numChars;    Tcl_UniChar ch;    unsigned short **toUnicode;    unsigned short *pageZero;    TableEncodingData *dataPtr;        srcStart = src;    srcEnd = src + srcLen;    dstStart = dst;    dstEnd = dst + dstLen - TCL_UTF_MAX;    dataPtr = (TableEncodingData *) clientData;    toUnicode = dataPtr->toUnicode;    prefixBytes = dataPtr->prefixBytes;    pageZero = toUnicode[0];    result = TCL_OK;    for (numChars = 0; src < srcEnd; numChars++) {        if (dst > dstEnd) {            result = TCL_CONVERT_NOSPACE;            break;        }	byte = *((unsigned char *) src);	if (prefixBytes[byte]) {	    src++;	    if (src >= srcEnd) {		src--;		result = TCL_CONVERT_MULTIBYTE;		break;	    }	    ch = toUnicode[byte][*((unsigned char *) src)];	} else {	    ch = pageZero[byte];	}	if ((ch == 0) && (byte != 0)) {	    if (flags & TCL_ENCODING_STOPONERROR) {		result = TCL_CONVERT_SYNTAX;		break;	    }	    if (prefixBytes[byte]) {		src--;	    }	    ch = (Tcl_UniChar) byte;	}	/*	 * Special case for 1-byte utf chars for speed.	 */	if (ch && ch < 0x80) {	    *dst++ = (char) ch;	} else {	    dst += Tcl_UniCharToUtf(ch, dst);	}        src++;    }    *srcReadPtr = src - srcStart;    *dstWrotePtr = dst - dstStart;    *dstCharsPtr = numChars;    return result;}/* *------------------------------------------------------------------------- * * TableFromUtfProc -- * *	Convert from UTF-8 into the encoding specified by the *	TableEncodingData. * * Results: *	Returns TCL_OK if conversion was successful. * * Side effects: *	None. * *------------------------------------------------------------------------- */static int TableFromUtfProc(clientData, src, srcLen, flags, statePtr, dst, dstLen,	srcReadPtr, dstWrotePtr, dstCharsPtr)    ClientData clientData;	/* TableEncodingData that specifies				 * encoding. */    CONST char *src;		/* Source string in UTF-8. */    int srcLen;			/* Source string length in bytes. */    int flags;			/* Conversion control flags. */    Tcl_EncodingState *statePtr;/* Place for conversion routine to store				 * state information used during a piecewise				 * conversion.  Contents of statePtr are				 * initialized and/or reset by conversion				 * routine under control of flags argument. */    char *dst;			/* Output buffer in which converted string				 * is stored. */    int dstLen;			/* The maximum length of output buffer in				 * bytes. */    int *srcReadPtr;		/* Filled with the number of bytes from the				 * source string that were converted.  This				 * may be less than the original source length				 * if there was a problem converting some				 * source characters. */    int *dstWrotePtr;		/* Filled with the number of bytes that were				 * stored in the output buffer as a result of				 * the conversion. */    int *dstCharsPtr;		/* Filled with the number of characters that				 * correspond to the bytes stored in t

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -