diff options
author | vincentdarley <vincentdarley> | 2004-10-07 14:50:21 (GMT) |
---|---|---|
committer | vincentdarley <vincentdarley> | 2004-10-07 14:50:21 (GMT) |
commit | d4961998794e12b24a57463f33d6d1976477cde3 (patch) | |
tree | 56b0a5bc0092ddc26c1ff14e61906c9ea713c988 /unix | |
parent | 4c14cd729fc9965bddaace767c865ce4a9825e89 (diff) | |
download | tcl-d4961998794e12b24a57463f33d6d1976477cde3.zip tcl-d4961998794e12b24a57463f33d6d1976477cde3.tar.gz tcl-d4961998794e12b24a57463f33d6d1976477cde3.tar.bz2 |
filesystem generic/platform code splitting
Diffstat (limited to 'unix')
-rw-r--r-- | unix/tclUnixFile.c | 129 |
1 files changed, 128 insertions, 1 deletions
diff --git a/unix/tclUnixFile.c b/unix/tclUnixFile.c index 07e43fc..842d1b6 100644 --- a/unix/tclUnixFile.c +++ b/unix/tclUnixFile.c @@ -9,10 +9,11 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixFile.c,v 1.41 2004/07/20 10:12:29 das Exp $ + * RCS: @(#) $Id: tclUnixFile.c,v 1.42 2004/10/07 14:50:23 vincentdarley Exp $ */ #include "tclInt.h" +#include "tclFileSystem.h" static int NativeMatchType(CONST char* nativeName, Tcl_GlobTypeData *types); @@ -903,6 +904,132 @@ TclpFilesystemPathType(pathPtr) /* *--------------------------------------------------------------------------- * + * TclpNativeToNormalized -- + * + * Convert native format to a normalized path object, with refCount + * of zero. + * + * Currently assumes all native paths are actually normalized + * already, so if the path given is not normalized this will + * actually just convert to a valid string path, but not + * necessarily a normalized one. + * + * Results: + * A valid normalized path. + * + * Side effects: + * None. + * + *--------------------------------------------------------------------------- + */ +Tcl_Obj* +TclpNativeToNormalized(clientData) + ClientData clientData; +{ + Tcl_DString ds; + Tcl_Obj *objPtr; + int len; + + CONST char *copy; + Tcl_ExternalToUtfDString(NULL, (CONST char*)clientData, -1, &ds); + + copy = Tcl_DStringValue(&ds); + len = Tcl_DStringLength(&ds); + + objPtr = Tcl_NewStringObj(copy,len); + Tcl_DStringFree(&ds); + + return objPtr; +} + +/* + *--------------------------------------------------------------------------- + * + * TclNativeCreateNativeRep -- + * + * Create a native representation for the given path. + * + * Results: + * The nativePath representation. + * + * Side effects: + * Memory will be allocated. The path may need to be normalized. + * + *--------------------------------------------------------------------------- + */ +ClientData +TclNativeCreateNativeRep(pathPtr) + Tcl_Obj* pathPtr; +{ + char *nativePathPtr; + Tcl_DString ds; + Tcl_Obj* validPathPtr; + int len; + char *str; + + if (TclFSCwdIsNative()) { + /* + * The cwd is native, which means we can use the translated + * path without worrying about normalization (this will also + * usually be shorter so the utf-to-external conversion will + * be somewhat faster). + */ + validPathPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr); + } else { + /* Make sure the normalized path is set */ + validPathPtr = Tcl_FSGetNormalizedPath(NULL, pathPtr); + Tcl_IncrRefCount(validPathPtr); + } + + str = Tcl_GetStringFromObj(validPathPtr, &len); + Tcl_UtfToExternalDString(NULL, str, len, &ds); + len = Tcl_DStringLength(&ds) + sizeof(char); + Tcl_DecrRefCount(validPathPtr); + nativePathPtr = ckalloc((unsigned) len); + memcpy((VOID*)nativePathPtr, (VOID*)Tcl_DStringValue(&ds), (size_t) len); + + Tcl_DStringFree(&ds); + return (ClientData)nativePathPtr; +} + +/* + *--------------------------------------------------------------------------- + * + * TclNativeDupInternalRep -- + * + * Duplicate the native representation. + * + * Results: + * The copied native representation, or NULL if it is not possible + * to copy the representation. + * + * Side effects: + * Memory will be allocated for the copy. + * + *--------------------------------------------------------------------------- + */ +ClientData +TclNativeDupInternalRep(clientData) + ClientData clientData; +{ + char *copy; + size_t len; + + if (clientData == NULL) { + return NULL; + } + + /* ascii representation when running on Unix */ + len = sizeof(char) + (strlen((CONST char*)clientData) * sizeof(char)); + + copy = (char *) ckalloc(len); + memcpy((VOID*)copy, (VOID*)clientData, len); + return (ClientData)copy; +} + +/* + *--------------------------------------------------------------------------- + * * TclpUtime -- * * Set the modification date for a file. |