Compare commits

...
Author SHA1 Message Date
dkf 7b9a059845 merge trunk 2012-08-04 07:46:48 +00:00
dkf d04987d73b merge trunk 2012-04-21 09:05:06 +00:00
dkf e2e7993f12 merge trunk 2012-03-28 13:32:12 +00:00
dkf 1a5e8637fb merge from trunk 2012-03-08 08:59:32 +00:00
dkf bc41a0ed8e merge trunk 2012-02-17 09:10:06 +00:00
dkf 81c9b1f148 merge trunk 2012-02-09 15:28:26 +00:00
dkf 0def1f2784 merge trunk 2012-02-04 17:49:04 +00:00
dkf 69b6cd3127 merge trunk 2012-01-23 09:38:35 +00:00
dkf 0f7fe2ad31 mark to avoid mistaken commit 2012-01-22 12:19:06 +00:00
dkf 90814f974b merge trunk 2012-01-22 12:06:24 +00:00
dkf 1c8bf96eef merge trunk 2012-01-16 13:35:23 +00:00
dkf ae8e3b449a merge trunk 2011-12-31 15:13:50 +00:00
dkf d3d74673fe merge trunk 2011-12-31 15:04:37 +00:00
dkf 4d0a932336 merge trunk 2011-11-26 16:04:31 +00:00
dkf 8af2408a42 Start of work on system for alias encodings, i.e., alternate names for encodings. 2011-10-27 20:35:29 +00:00
+174
View File
@@ -132,6 +132,17 @@ typedef struct EscapeEncodingData {
#define ENCODING_MULTIBYTE 2
#define ENCODING_ESCAPE 3
/*
* Data used for an alias encoding.
*/
typedef struct {
Tcl_Obj *aliasName; /* The name of the encoding that this is an
* alias for. */
Tcl_Encoding aliasEncoding; /* Reference to the encoding that this is an
* alias for. Will not be an alias itself. */
} AliasEncoding;
/*
* A list of directories in which Tcl should look for *.enc files. This list
* is shared by all threads. Access is governed by a mutex lock.
@@ -200,6 +211,17 @@ static int BinaryProc(ClientData clientData,
int *srcReadPtr, int *dstWrotePtr,
int *dstCharsPtr);
static void DupEncodingIntRep(Tcl_Obj *srcPtr, Tcl_Obj *dupPtr);
static void AliasFreeProc(ClientData clientData);
static int AliasFromUtfProc(ClientData clientData,
const char *src, int srcLen, int flags,
Tcl_EncodingState *statePtr, char *dst, int dstLen,
int *srcReadPtr, int *dstWrotePtr,
int *dstCharsPtr);
static int AliasToUtfProc(ClientData clientData,
const char *src, int srcLen, int flags,
Tcl_EncodingState *statePtr, char *dst, int dstLen,
int *srcReadPtr, int *dstWrotePtr,
int *dstCharsPtr);
static void EscapeFreeProc(ClientData clientData);
static int EscapeFromUtfProc(ClientData clientData,
const char *src, int srcLen, int flags,
@@ -220,6 +242,7 @@ static Tcl_Encoding LoadEncodingFile(Tcl_Interp *interp, const char *name);
static Tcl_Encoding LoadTableEncoding(const char *name, int type,
Tcl_Channel chan);
static Tcl_Encoding LoadEscapeEncoding(const char *name, Tcl_Channel chan);
static Tcl_Encoding LoadAliasEncoding(const char *name, Tcl_Channel chan);
static Tcl_Channel OpenEncodingFileChannel(Tcl_Interp *interp,
const char *name);
static void TableFreeProc(ClientData clientData);
@@ -1615,6 +1638,9 @@ LoadEncodingFile(
case 'E':
encoding = LoadEscapeEncoding(name, chan);
break;
case 'A':
encoding = LoadAliasEncoding(name, chan);
break;
}
if ((encoding == NULL) && (interp != NULL)) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
@@ -2053,6 +2079,71 @@ LoadEscapeEncoding(
return Tcl_CreateEncoding(&type);
}
/*
*-------------------------------------------------------------------------
*
* LoadAliasEncoding --
*
* Helper function for LoadEncodingTable(). Loads an alias to another
* encoding.
*
* File contains text data that describes what the encoding is an alias
* for.
*
* Results:
* The return value is the new encoding, or NULL if the encoding could
* not be created (because the file contained invalid data).
*
* Side effects:
* None.
*
*-------------------------------------------------------------------------
*/
static Tcl_Encoding
LoadAliasEncoding(
const char *name, /* Name for new encoding. */
Tcl_Channel chan) /* File containing new encoding. */
{
Tcl_Obj *objPtr;
AliasEncoding *aliasPtr;
Tcl_EncodingType type;
TclNewObj(objPtr);
Tcl_IncrRefCount(objPtr);
if (Tcl_GetsObj(chan, objPtr) < 0) {
Tcl_DecrRefCount(objPtr);
return NULL;
}
aliasPtr = ckalloc(sizeof(AliasEncoding));
aliasPtr->aliasName = objPtr;
if (Tcl_GetEncodingFromObj(NULL, objPtr,
&aliasPtr->aliasEncoding) != TCL_OK) {
ckfree(aliasPtr);
Tcl_DecrRefCount(objPtr);
return NULL;
}
/*
* Check for (and prohibit) alias loops.
*/
if (((Encoding *) aliasPtr->aliasEncoding)->freeProc == AliasFreeProc) {
ckfree(aliasPtr);
Tcl_DecrRefCount(objPtr);
return NULL;
}
type.encodingName = name;
type.toUtfProc = AliasToUtfProc;
type.fromUtfProc = AliasFromUtfProc;
type.freeProc = AliasFreeProc;
type.nullSize = 1;
type.clientData = aliasPtr;
return Tcl_CreateEncoding(&type);
}
/*
*-------------------------------------------------------------------------
*
@@ -3577,6 +3668,89 @@ InitializeEncodingSearchPath(
Tcl_DecrRefCount(searchPathObj);
}
/*
*-------------------------------------------------------------------------
*
* AliasFreeProc --
*
* How to dispose of an alias encoding.
*
*-------------------------------------------------------------------------
*/
static void
AliasFreeProc(
ClientData clientData)
{
AliasEncoding *aliasPtr = clientData;
FreeEncoding(aliasPtr->aliasEncoding);
Tcl_DecrRefCount(aliasPtr->aliasName);
ckfree(aliasPtr);
}
/*
*-------------------------------------------------------------------------
*
* AliasToUtfProc --
*
* How to convert from Tcl's internal quasi-UTF8 format to an encoding
* that is an alias for another one.
*
*-------------------------------------------------------------------------
*/
static int
AliasFromUtfProc(
ClientData clientData,
const char *src,
int srcLen,
int flags,
Tcl_EncodingState *statePtr,
char *dst,
int dstLen,
int *srcReadPtr,
int *dstWrotePtr,
int *dstCharsPtr)
{
AliasEncoding *aliasPtr = clientData;
return Tcl_UtfToExternal(NULL, aliasPtr->aliasEncoding, src, srcLen,
flags, statePtr, dst, dstLen, srcReadPtr, dstWrotePtr,
dstCharsPtr);
}
/*
*-------------------------------------------------------------------------
*
* AliasToUtfProc --
*
* How to convert from an encoding that is an alias for another one to
* Tcl's internal quasi-UTF8 format.
*
*-------------------------------------------------------------------------
*/
static int
AliasToUtfProc(
ClientData clientData,
const char *src,
int srcLen,
int flags,
Tcl_EncodingState *statePtr,
char *dst,
int dstLen,
int *srcReadPtr,
int *dstWrotePtr,
int *dstCharsPtr)
{
AliasEncoding *aliasPtr = clientData;
return Tcl_ExternalToUtf(NULL, aliasPtr->aliasEncoding, src, srcLen,
flags, statePtr, dst, dstLen, srcReadPtr, dstWrotePtr,
dstCharsPtr);
}
/*
* Local Variables:
* mode: c