summaryrefslogtreecommitdiffstats
path: root/generic/tclFileName.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclFileName.c')
-rw-r--r--generic/tclFileName.c401
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));
}
/*