diff options
Diffstat (limited to 'generic/tclFileName.c')
| -rw-r--r-- | generic/tclFileName.c | 401 |
1 files changed, 128 insertions, 273 deletions
diff --git a/generic/tclFileName.c b/generic/tclFileName.c index 0cfc659..a8360fc 100644 --- a/generic/tclFileName.c +++ b/generic/tclFileName.c @@ -37,16 +37,6 @@ static Tcl_Obj * SplitUnixPath(const char *path); static int DoGlob(Tcl_Interp *interp, Tcl_Obj *resultPtr, const char *separators, Tcl_Obj *pathPtr, int flags, char *pattern, Tcl_GlobTypeData *types); - -/* - * When there is no support for getting the block size of a file in a stat() - * call, use this as a guess. Allow it to be overridden in the platform- - * specific files. - */ - -#if (!defined(HAVE_STRUCT_STAT_ST_BLKSIZE) && !defined(GUESSED_BLOCK_SIZE)) -#define GUESSED_BLOCK_SIZE 1024 -#endif /* *---------------------------------------------------------------------- @@ -72,9 +62,9 @@ SetResultLength( { Tcl_DStringSetLength(resultPtr, offset); if (extended == 2) { - TclDStringAppendLiteral(resultPtr, "//?/UNC/"); + Tcl_DStringAppend(resultPtr, "//?/UNC/", 8); } else if (extended == 1) { - TclDStringAppendLiteral(resultPtr, "//?/"); + Tcl_DStringAppend(resultPtr, "//?/", 4); } } @@ -131,7 +121,7 @@ ExtractWinRoot( if (path[1] != '/' && path[1] != '\\') { SetResultLength(resultPtr, offset, extended); *typePtr = TCL_PATH_VOLUME_RELATIVE; - TclDStringAppendLiteral(resultPtr, "/"); + Tcl_DStringAppend(resultPtr, "/", 1); return &path[1]; } host = &path[2]; @@ -161,7 +151,7 @@ ExtractWinRoot( */ *typePtr = TCL_PATH_VOLUME_RELATIVE; - TclDStringAppendLiteral(resultPtr, "/"); + Tcl_DStringAppend(resultPtr, "/", 1); return &path[2]; } SetResultLength(resultPtr, offset, extended); @@ -180,9 +170,9 @@ ExtractWinRoot( break; } } - TclDStringAppendLiteral(resultPtr, "//"); + Tcl_DStringAppend(resultPtr, "//", 2); Tcl_DStringAppend(resultPtr, host, hlen); - TclDStringAppendLiteral(resultPtr, "/"); + Tcl_DStringAppend(resultPtr, "/", 1); Tcl_DStringAppend(resultPtr, share, slen); tail = &share[slen]; @@ -221,7 +211,7 @@ ExtractWinRoot( *typePtr = TCL_PATH_ABSOLUTE; Tcl_DStringAppend(resultPtr, path, 2); - TclDStringAppendLiteral(resultPtr, "/"); + Tcl_DStringAppend(resultPtr, "/", 1); return tail; } @@ -235,9 +225,9 @@ ExtractWinRoot( if ((path[0] == 'c' || path[0] == 'C') && (path[1] == 'o' || path[1] == 'O')) { if ((path[2] == 'm' || path[2] == 'M') - && path[3] >= '1' && path[3] <= '4') { + && path[3] >= '1' && path[3] <= '9') { /* - * May have match for 'com[1-4]:?', which is a serial port. + * May have match for 'com[1-9]:?', which is a serial port. */ if (path[4] == '\0') { @@ -257,9 +247,9 @@ ExtractWinRoot( } else if ((path[0] == 'l' || path[0] == 'L') && (path[1] == 'p' || path[1] == 'P') && (path[2] == 't' || path[2] == 'T')) { - if (path[3] >= '1' && path[3] <= '3') { + if (path[3] >= '1' && path[3] <= '9') { /* - * May have match for 'lpt[1-3]:?' + * May have match for 'lpt[1-9]:?' */ if (path[4] == '\0') { @@ -342,7 +332,7 @@ Tcl_GetPathType( const char *path) { Tcl_PathType type; - Tcl_Obj *tempObj = Tcl_NewStringObj(path, TCL_STRLEN); + Tcl_Obj *tempObj = Tcl_NewStringObj(path,-1); Tcl_IncrRefCount(tempObj); type = Tcl_FSGetPathType(tempObj); @@ -381,12 +371,12 @@ Tcl_GetPathType( Tcl_PathType TclpGetNativePathType( Tcl_Obj *pathPtr, /* Native path of interest */ - size_t *driveNameLengthPtr, /* Returns length of drive, if non-NULL and + int *driveNameLengthPtr, /* Returns length of drive, if non-NULL and * path was absolute */ Tcl_Obj **driveNameRef) { Tcl_PathType type = TCL_PATH_ABSOLUTE; - size_t pathLen; + int pathLen; const char *path = Tcl_GetStringFromObj(pathPtr, &pathLen); if (path[0] == '~') { @@ -456,7 +446,8 @@ TclpGetNativePathType( if ((rootEnd != path) && (driveNameLengthPtr != NULL)) { *driveNameLengthPtr = rootEnd - path; if (driveNameRef != NULL) { - *driveNameRef = TclDStringToObj(&ds); + *driveNameRef = Tcl_NewStringObj(Tcl_DStringValue(&ds), + Tcl_DStringLength(&ds)); Tcl_IncrRefCount(*driveNameRef); } } @@ -494,7 +485,7 @@ TclpGetNativePathType( Tcl_Obj * TclpNativeSplitPath( Tcl_Obj *pathPtr, /* Path to split. */ - size_t *lenPtr) /* int to store number of path elements. */ + int *lenPtr) /* int to store number of path elements. */ { Tcl_Obj *resultPtr = NULL; /* Needed only to prevent gcc warnings. */ @@ -550,14 +541,14 @@ TclpNativeSplitPath( void Tcl_SplitPath( const char *path, /* Pointer to string containing a path. */ - size_t *argcPtr, /* Pointer to location to fill in with the + int *argcPtr, /* Pointer to location to fill in with the * number of elements in the path. */ const char ***argvPtr) /* Pointer to place to store pointer to array * of pointers to path elements. */ { Tcl_Obj *resultPtr = NULL; /* Needed only to prevent gcc warnings. */ Tcl_Obj *tmpPtr, *eltPtr; - size_t i, size, len; + int i, size, len; char *p; const char *str; @@ -565,7 +556,7 @@ Tcl_SplitPath( * Perform the splitting, using objectified, vfs-aware code. */ - tmpPtr = Tcl_NewStringObj(path, TCL_STRLEN); + tmpPtr = Tcl_NewStringObj(path, -1); Tcl_IncrRefCount(tmpPtr); resultPtr = Tcl_FSSplitPath(tmpPtr, argcPtr); Tcl_IncrRefCount(resultPtr); @@ -587,7 +578,8 @@ Tcl_SplitPath( * plus the argv pointers and the terminating NULL pointer. */ - *argvPtr = ckalloc((((*argcPtr) + 1) * sizeof(char *)) + size); + *argvPtr = (const char **) ckalloc((unsigned) + ((((*argcPtr) + 1) * sizeof(char *)) + size)); /* * Position p after the last argv pointer and copy the contents of the @@ -745,7 +737,8 @@ SplitWinPath( */ if (p != path) { - Tcl_ListObjAppendElement(NULL, result, TclDStringToObj(&buf)); + Tcl_ListObjAppendElement(NULL, result, Tcl_NewStringObj( + Tcl_DStringValue(&buf), Tcl_DStringLength(&buf))); } Tcl_DStringFree(&buf); @@ -763,7 +756,6 @@ SplitWinPath( length = p - elementStart; if (length > 0) { Tcl_Obj *nextElt; - if ((elementStart != path) && ((elementStart[0] == '~') || (isalpha(UCHAR(elementStart[0])) && elementStart[1] == ':'))) { @@ -805,31 +797,35 @@ SplitWinPath( Tcl_Obj * Tcl_FSJoinToPath( Tcl_Obj *pathPtr, /* Valid path or NULL. */ - size_t objc, /* Number of array elements to join */ + int objc, /* Number of array elements to join */ Tcl_Obj *const objv[]) /* Path elements to join. */ { + int i; + Tcl_Obj *lobj, *ret; + if (pathPtr == NULL) { - return TclJoinPath(objc, objv); - } - if (objc == 0) { - return TclJoinPath(1, &pathPtr); + lobj = Tcl_NewListObj(0, NULL); + } else { + lobj = Tcl_NewListObj(1, &pathPtr); } - if (objc == 1) { - Tcl_Obj *pair[2]; - pair[0] = pathPtr; - pair[1] = objv[0]; - return TclJoinPath(2, pair); - } else { - int elemc = objc + 1; - Tcl_Obj *ret, **elemv = ckalloc(elemc*sizeof(Tcl_Obj **)); - - elemv[0] = pathPtr; - memcpy(elemv+1, objv, objc*sizeof(Tcl_Obj **)); - ret = TclJoinPath(elemc, elemv); - ckfree(elemv); - return ret; + for (i = 0; i<objc;i++) { + Tcl_ListObjAppendElement(NULL, lobj, objv[i]); } + ret = Tcl_FSJoinPath(lobj, -1); + + /* + * It is possible that 'ret' is just a member of the list and is therefore + * going to be freed here. Therefore we must adjust the refCount manually. + * (It would be better if we changed the documentation of this function + * and Tcl_FSJoinPath so that the returned object already has a refCount + * for the caller, hence avoiding these subtleties (and code ugliness)). + */ + + Tcl_IncrRefCount(ret); + Tcl_DecrRefCount(lobj); + ret->refCount--; + return ret; } /* @@ -853,11 +849,10 @@ TclpNativeJoinPath( Tcl_Obj *prefix, const char *joining) { - int needsSep; + int length, needsSep; char *dest; const char *p; const char *start; - size_t length; start = Tcl_GetStringFromObj(prefix, &length); @@ -974,11 +969,11 @@ TclpNativeJoinPath( char * Tcl_JoinPath( - size_t argc, + int argc, const char *const *argv, Tcl_DString *resultPtr) /* Pointer to previously initialized DString */ { - size_t i, len; + int i, len; Tcl_Obj *listObj = Tcl_NewObj(); Tcl_Obj *resultObj; const char *resultStr; @@ -989,7 +984,7 @@ Tcl_JoinPath( for (i = 0; i < argc; i++) { Tcl_ListObjAppendElement(NULL, listObj, - Tcl_NewStringObj(argv[i], TCL_STRLEN)); + Tcl_NewStringObj(argv[i], -1)); } /* @@ -1053,7 +1048,7 @@ Tcl_TranslateFileName( Tcl_DString *bufferPtr) /* Uninitialized or free DString filled with * name after tilde substitution. */ { - Tcl_Obj *path = Tcl_NewStringObj(name, TCL_STRLEN); + Tcl_Obj *path = Tcl_NewStringObj(name, -1); Tcl_Obj *transPtr; Tcl_IncrRefCount(path); @@ -1064,7 +1059,7 @@ Tcl_TranslateFileName( } Tcl_DStringInit(bufferPtr); - TclDStringAppendObj(bufferPtr, transPtr); + Tcl_DStringAppend(bufferPtr, Tcl_GetString(transPtr), -1); Tcl_DecrRefCount(path); Tcl_DecrRefCount(transPtr); @@ -1181,10 +1176,9 @@ DoTildeSubst( dir = TclGetEnv("HOME", &dirString); if (dir == NULL) { if (interp) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "couldn't find HOME environment " - "variable to expand path", TCL_STRLEN)); - Tcl_SetErrorCode(interp, "TCL", "FILENAME", "NO_HOME", NULL); + Tcl_ResetResult(interp); + Tcl_AppendResult(interp, "couldn't find HOME environment " + "variable to expand path", NULL); } return NULL; } @@ -1193,9 +1187,8 @@ DoTildeSubst( } else if (TclpGetUserHome(user, resultPtr) == NULL) { if (interp) { Tcl_ResetResult(interp); - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "user \"%s\" doesn't exist", user)); - Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "USER", user, NULL); + Tcl_AppendResult(interp, "user \"", user, "\" doesn't exist", + NULL); } return NULL; } @@ -1224,17 +1217,16 @@ int Tcl_GlobObjCmd( ClientData dummy, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ - size_t objc, /* Number of arguments. */ + int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { - int index, i, globFlags, join, dir, result; + int index, i, globFlags, length, join, dir, result; char *string; - size_t length; const char *separators; - Tcl_Obj *typePtr, *look; + Tcl_Obj *typePtr, *resultPtr, *look; Tcl_Obj *pathOrDir = NULL; Tcl_DString prefix; - static const char *const options[] = { + static const char *options[] = { "-directory", "-join", "-nocomplain", "-path", "-tails", "-types", "--", NULL }; @@ -1278,16 +1270,12 @@ Tcl_GlobObjCmd( case GLOB_DIR: /* -dir */ if (i == (objc-1)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "missing argument to \"-directory\"", TCL_STRLEN)); - Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "MISSING", NULL); + "missing argument to \"-directory\"", -1)); return TCL_ERROR; } if (dir != PATH_NONE) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\"-directory\" cannot be used with \"-path\"", - TCL_STRLEN)); - Tcl_SetErrorCode(interp, "TCL", "OPERATION", "GLOB", - "BADOPTIONCOMBINATION", NULL); + "\"-directory\" cannot be used with \"-path\"", -1)); return TCL_ERROR; } dir = PATH_DIR; @@ -1304,16 +1292,12 @@ Tcl_GlobObjCmd( case GLOB_PATH: /* -path */ if (i == (objc-1)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "missing argument to \"-path\"", TCL_STRLEN)); - Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "MISSING", NULL); + "missing argument to \"-path\"", -1)); return TCL_ERROR; } if (dir != PATH_NONE) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\"-path\" cannot be used with \"-directory\"", - TCL_STRLEN)); - Tcl_SetErrorCode(interp, "TCL", "OPERATION", "GLOB", - "BADOPTIONCOMBINATION", NULL); + "\"-path\" cannot be used with \"-directory\"", -1)); return TCL_ERROR; } dir = PATH_GENERAL; @@ -1323,8 +1307,7 @@ Tcl_GlobObjCmd( case GLOB_TYPE: /* -types */ if (i == (objc-1)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "missing argument to \"-types\"", TCL_STRLEN)); - Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "MISSING", NULL); + "missing argument to \"-types\"", -1)); return TCL_ERROR; } typePtr = objv[i+1]; @@ -1340,12 +1323,14 @@ Tcl_GlobObjCmd( } endOfForLoop: + if (objc - i < 1) { + Tcl_WrongNumArgs(interp, 1, objv, "?switches? name ?name ...?"); + return TCL_ERROR; + } if ((globFlags & TCL_GLOBMODE_TAILS) && (pathOrDir == NULL)) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( + Tcl_AppendResult(interp, "\"-tails\" must be used with either " - "\"-directory\" or \"-path\"", TCL_STRLEN)); - Tcl_SetErrorCode(interp, "TCL", "OPERATION", "GLOB", - "BADOPTIONCOMBINATION", NULL); + "\"-directory\" or \"-path\"", NULL); return TCL_ERROR; } @@ -1360,7 +1345,7 @@ Tcl_GlobObjCmd( } if (dir == PATH_GENERAL) { - size_t pathlength; + int pathlength; const char *last; const char *first = Tcl_GetStringFromObj(pathOrDir,&pathlength); @@ -1394,7 +1379,7 @@ Tcl_GlobObjCmd( * in TclGlob requires a non-NULL pathOrDir. */ - Tcl_DStringAppend(&pref, first, TCL_STRLEN); + Tcl_DStringAppend(&pref, first, -1); globFlags &= ~TCL_GLOBMODE_TAILS; pathOrDir = NULL; } else { @@ -1425,7 +1410,7 @@ Tcl_GlobObjCmd( search = Tcl_DStringValue(&pref); while ((find = (strpbrk(search, "\\[]*?{}"))) != NULL) { Tcl_DStringAppend(&prefix, search, find-search); - TclDStringAppendLiteral(&prefix, "\\"); + Tcl_DStringAppend(&prefix, "\\", 1); Tcl_DStringAppend(&prefix, find, 1); search = find+1; if (*search == '\0') { @@ -1433,7 +1418,7 @@ Tcl_GlobObjCmd( } } if (*search != '\0') { - Tcl_DStringAppend(&prefix, search, TCL_STRLEN); + Tcl_DStringAppend(&prefix, search, -1); } Tcl_DStringFree(&pref); } @@ -1454,14 +1439,15 @@ Tcl_GlobObjCmd( if (length <= 0) { goto skipTypes; } - globTypes = TclStackAlloc(interp, sizeof(Tcl_GlobTypeData)); + globTypes = (Tcl_GlobTypeData*) + TclStackAlloc(interp,sizeof(Tcl_GlobTypeData)); globTypes->type = 0; globTypes->perm = 0; globTypes->macType = NULL; globTypes->macCreator = NULL; - while (length-->0) { - size_t len; + while (--length >= 0) { + int len; const char *str; Tcl_ListObjIndex(interp, typePtr, length, &look); @@ -1551,10 +1537,10 @@ Tcl_GlobObjCmd( */ badTypesArg: - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "bad argument to \"-types\": %s", - Tcl_GetString(look))); - Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "BAD", NULL); + TclNewObj(resultPtr); + Tcl_AppendToObj(resultPtr, "bad argument to \"-types\": ", -1); + Tcl_AppendObjToObj(resultPtr, look); + Tcl_SetObjResult(interp, resultPtr); result = TCL_ERROR; join = 0; goto endOfGlob; @@ -1562,9 +1548,8 @@ Tcl_GlobObjCmd( badMacTypesArg: Tcl_SetObjResult(interp, Tcl_NewStringObj( "only one MacOS type or creator argument" - " to \"-types\" allowed", TCL_STRLEN)); + " to \"-types\" allowed", -1)); result = TCL_ERROR; - Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "BAD", NULL); join = 0; goto endOfGlob; } @@ -1587,8 +1572,9 @@ Tcl_GlobObjCmd( Tcl_DStringInit(&prefix); } for (i = 0; i < objc; i++) { - TclDStringAppendObj(&prefix, objv[i]); - if (i != objc-1) { + string = Tcl_GetStringFromObj(objv[i], &length); + Tcl_DStringAppend(&prefix, string, length); + if (i != objc -1) { Tcl_DStringAppend(&prefix, separators, 1); } } @@ -1603,9 +1589,11 @@ Tcl_GlobObjCmd( for (i = 0; i < objc; i++) { Tcl_DStringInit(&str); if (dir == PATH_GENERAL) { - TclDStringAppendDString(&str, &prefix); + Tcl_DStringAppend(&str, Tcl_DStringValue(&prefix), + Tcl_DStringLength(&prefix)); } - TclDStringAppendObj(&str, objv[i]); + string = Tcl_GetStringFromObj(objv[i], &length); + Tcl_DStringAppend(&str, string, length); if (TclGlob(interp, Tcl_DStringValue(&str), pathOrDir, globFlags, globTypes) != TCL_OK) { result = TCL_ERROR; @@ -1637,26 +1625,19 @@ Tcl_GlobObjCmd( } if (length == 0) { - Tcl_Obj *errorMsg = - Tcl_ObjPrintf("no files matched glob pattern%s \"", - (join || (objc == 1)) ? "" : "s"); - + Tcl_AppendResult(interp, "no files matched glob pattern", + (join || (objc == 1)) ? " \"" : "s \"", NULL); if (join) { - Tcl_AppendToObj(errorMsg, Tcl_DStringValue(&prefix), - TCL_STRLEN); + Tcl_AppendResult(interp, Tcl_DStringValue(&prefix), NULL); } else { const char *sep = ""; - for (i = 0; i < objc; i++) { - Tcl_AppendPrintfToObj(errorMsg, "%s%s", - sep, Tcl_GetString(objv[i])); + string = Tcl_GetString(objv[i]); + Tcl_AppendResult(interp, sep, string, NULL); sep = " "; } } - Tcl_AppendToObj(errorMsg, "\"", TCL_STRLEN); - Tcl_SetObjResult(interp, errorMsg); - Tcl_SetErrorCode(interp, "TCL", "OPERATION", "GLOB", "NOMATCH", - NULL); + Tcl_AppendResult(interp, "\"", NULL); result = TCL_ERROR; } } @@ -1777,9 +1758,10 @@ TclGlob( return TCL_ERROR; } if (head != Tcl_DStringValue(&buffer)) { - Tcl_DStringAppend(&buffer, head, TCL_STRLEN); + Tcl_DStringAppend(&buffer, head, -1); } - pathPrefix = TclDStringToObj(&buffer); + pathPrefix = Tcl_NewStringObj(Tcl_DStringValue(&buffer), + Tcl_DStringLength(&buffer)); Tcl_IncrRefCount(pathPrefix); globFlags |= TCL_GLOBMODE_DIR; if (c != '\0') { @@ -1831,9 +1813,9 @@ TclGlob( Tcl_IncrRefCount(pathPrefix); } else if (pathPrefix == NULL && (tail[0] == '/' || (tail[0] == '\\' && tail[1] == '\\'))) { - size_t driveNameLen; + int driveNameLen; Tcl_Obj *driveName; - Tcl_Obj *temp = Tcl_NewStringObj(tail, TCL_STRLEN); + Tcl_Obj *temp = Tcl_NewStringObj(tail, -1); Tcl_IncrRefCount(temp); switch (TclGetPathType(temp, NULL, &driveNameLen, &driveName)) { @@ -1899,10 +1881,9 @@ TclGlob( */ if (pathPrefix == NULL) { - size_t driveNameLen; + int driveNameLen; Tcl_Obj *driveName; - - if (TclFSNonnativePathType(tail, strlen(tail), NULL, + if (TclFSNonnativePathType(tail, (int) strlen(tail), NULL, &driveNameLen, &driveName) == TCL_PATH_ABSOLUTE) { pathPrefix = driveName; tail += driveNameLen; @@ -1985,8 +1966,9 @@ TclGlob( */ if (globFlags & TCL_GLOBMODE_TAILS) { + int objc, i; Tcl_Obj **objv; - size_t objc, i, prefixLen; + int prefixLen; const char *pre; /* @@ -2014,7 +1996,7 @@ TclGlob( Tcl_ListObjGetElements(NULL, filenamesObj, &objc, &objv); for (i = 0; i< objc; i++) { - size_t len; + int len; const char *oldStr = Tcl_GetStringFromObj(objv[i], &len); Tcl_Obj *elem; @@ -2223,17 +2205,13 @@ DoGlob( closeBrace = p; break; } - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "unmatched open-brace in file name", TCL_STRLEN)); - Tcl_SetErrorCode(interp, "TCL", "OPERATION", "GLOB", "BALANCE", - NULL); + Tcl_SetResult(interp, "unmatched open-brace in file name", + TCL_STATIC); return TCL_ERROR; } else if (*p == '}') { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "unmatched close-brace in file name", TCL_STRLEN)); - Tcl_SetErrorCode(interp, "TCL", "OPERATION", "GLOB", "BALANCE", - NULL); + Tcl_SetResult(interp, "unmatched close-brace in file name", + TCL_STATIC); return TCL_ERROR; } } @@ -2263,7 +2241,7 @@ DoGlob( SkipToChar(&p, ','); Tcl_DStringSetLength(&newName, baseLength); Tcl_DStringAppend(&newName, element, p-element); - Tcl_DStringAppend(&newName, closeBrace+1, TCL_STRLEN); + Tcl_DStringAppend(&newName, closeBrace+1, -1); result = DoGlob(interp, matchesObj, separators, pathPtr, flags, Tcl_DStringValue(&newName), types); if (result != TCL_OK) { @@ -2338,9 +2316,8 @@ DoGlob( pattern, &dirOnly); *p = save; if (result == TCL_OK) { - size_t repair = TCL_STRLEN; + int subdirc, i, repair = -1; Tcl_Obj **subdirv; - size_t subdirc, i; result = Tcl_ListObjGetElements(interp, subdirsPtr, &subdirc, &subdirv); @@ -2357,14 +2334,14 @@ DoGlob( result = DoGlob(interp, matchesObj, separators, subdirv[i], 1, p+1, types); if (copy) { - size_t end; + int end; Tcl_DecrRefCount(subdirv[i]); subdirv[i] = copy; Tcl_ListObjLength(NULL, matchesObj, &end); while (repair < end) { const char *bytes; - size_t numBytes; + int numBytes; Tcl_Obj *fixme, *newObj; Tcl_ListObjIndex(NULL, matchesObj, repair, &fixme); @@ -2374,7 +2351,7 @@ DoGlob( 1, &newObj); repair++; } - repair = TCL_STRLEN; + repair = -1; } } } @@ -2387,7 +2364,7 @@ DoGlob( */ if (*p == '\0') { - size_t length; + int length; Tcl_DString append; /* @@ -2416,9 +2393,9 @@ DoGlob( if (length == 0 && (Tcl_DStringLength(&append) == 0)) { if (((*name == '\\') && (name[1] == '/' || name[1] == '\\')) || (*name == '/')) { - TclDStringAppendLiteral(&append, "/"); + Tcl_DStringAppend(&append, "/", 1); } else { - TclDStringAppendLiteral(&append, "."); + Tcl_DStringAppend(&append, ".", 1); } } @@ -2427,9 +2404,9 @@ DoGlob( case TCL_PLATFORM_UNIX: if (length == 0 && (Tcl_DStringLength(&append) == 0)) { if ((*name == '\\' && name[1] == '/') || (*name == '/')) { - TclDStringAppendLiteral(&append, "/"); + Tcl_DStringAppend(&append, "/", 1); } else { - TclDStringAppendLiteral(&append, "."); + Tcl_DStringAppend(&append, ".", 1); } } break; @@ -2440,7 +2417,8 @@ DoGlob( */ if (pathPtr == NULL) { - joinedPtr = TclDStringToObj(&append); + joinedPtr = Tcl_NewStringObj(Tcl_DStringValue(&append), + Tcl_DStringLength(&append)); } else if (flags) { joinedPtr = TclNewFSPathObj(pathPtr, Tcl_DStringValue(&append), Tcl_DStringLength(&append)); @@ -2451,7 +2429,7 @@ DoGlob( * The current prefix must end in a separator. */ - size_t len; + int len; const char *joined = Tcl_GetStringFromObj(joinedPtr,&len); if (strchr(separators, joined[len-1]) == NULL) { @@ -2488,7 +2466,7 @@ DoGlob( * This behaviour is not currently tested for in the test suite. */ - size_t len; + int len; const char *joined = Tcl_GetStringFromObj(joinedPtr,&len); if (strchr(separators, joined[len-1]) == NULL) { @@ -2529,130 +2507,7 @@ DoGlob( Tcl_StatBuf * Tcl_AllocStatBuf(void) { - return ckalloc(sizeof(Tcl_StatBuf)); -} - -/* - *--------------------------------------------------------------------------- - * - * Access functions for Tcl_StatBuf -- - * - * These functions provide portable read-only access to the portable - * fields of the Tcl_StatBuf structure (really a 'struct stat', 'struct - * stat64' or something else related). [TIP #316] - * - * Results: - * The value from the field being retrieved. - * - * Side effects: - * None. - * - *--------------------------------------------------------------------------- - */ - -unsigned -Tcl_GetFSDeviceFromStat( - const Tcl_StatBuf *statPtr) -{ - return (unsigned) statPtr->st_dev; -} - -unsigned -Tcl_GetFSInodeFromStat( - const Tcl_StatBuf *statPtr) -{ - return (unsigned) statPtr->st_ino; -} - -unsigned -Tcl_GetModeFromStat( - const Tcl_StatBuf *statPtr) -{ - return (unsigned) statPtr->st_mode; -} - -int -Tcl_GetLinkCountFromStat( - const Tcl_StatBuf *statPtr) -{ - return (int)statPtr->st_nlink; -} - -int -Tcl_GetUserIdFromStat( - const Tcl_StatBuf *statPtr) -{ - return (int) statPtr->st_uid; -} - -int -Tcl_GetGroupIdFromStat( - const Tcl_StatBuf *statPtr) -{ - return (int) statPtr->st_gid; -} - -int -Tcl_GetDeviceTypeFromStat( - const Tcl_StatBuf *statPtr) -{ - return (int) statPtr->st_rdev; -} - -Tcl_WideInt -Tcl_GetAccessTimeFromStat( - const Tcl_StatBuf *statPtr) -{ - return (Tcl_WideInt) statPtr->st_atime; -} - -Tcl_WideInt -Tcl_GetModificationTimeFromStat( - const Tcl_StatBuf *statPtr) -{ - return (Tcl_WideInt) statPtr->st_mtime; -} - -Tcl_WideInt -Tcl_GetChangeTimeFromStat( - const Tcl_StatBuf *statPtr) -{ - return (Tcl_WideInt) statPtr->st_ctime; -} - -Tcl_WideUInt -Tcl_GetSizeFromStat( - const Tcl_StatBuf *statPtr) -{ - return (Tcl_WideUInt) statPtr->st_size; -} - -Tcl_WideUInt -Tcl_GetBlocksFromStat( - const Tcl_StatBuf *statPtr) -{ -#ifdef HAVE_STRUCT_STAT_ST_BLOCKS - return (Tcl_WideUInt) statPtr->st_blocks; -#else - register unsigned blksize = Tcl_GetBlockSizeFromStat(statPtr); - - return ((Tcl_WideUInt) statPtr->st_size + blksize - 1) / blksize; -#endif -} - -unsigned -Tcl_GetBlockSizeFromStat( - const Tcl_StatBuf *statPtr) -{ -#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE - return (unsigned) statPtr->st_blksize; -#else - /* - * Not a great guess, but will do... - */ - - return GUESSED_BLOCK_SIZE; -#endif + return (Tcl_StatBuf *) ckalloc(sizeof(Tcl_StatBuf)); } /* |
