diff options
Diffstat (limited to 'generic/tclScan.c')
-rw-r--r-- | generic/tclScan.c | 132 |
1 files changed, 52 insertions, 80 deletions
diff --git a/generic/tclScan.c b/generic/tclScan.c index 4dfc2d6..229f3fa 100644 --- a/generic/tclScan.c +++ b/generic/tclScan.c @@ -43,10 +43,10 @@ typedef struct CharSet { * Declarations for functions used only in this file. */ -static const char * BuildCharSet(CharSet *cset, const char *format); +static char * BuildCharSet(CharSet *cset, char *format); static int CharInSet(CharSet *cset, int ch); static void ReleaseCharSet(CharSet *cset); -static int ValidateFormat(Tcl_Interp *interp, const char *format, +static int ValidateFormat(Tcl_Interp *interp, char *format, int numVars, int *totalVars); /* @@ -67,14 +67,14 @@ static int ValidateFormat(Tcl_Interp *interp, const char *format, *---------------------------------------------------------------------- */ -static const char * +static char * BuildCharSet( CharSet *cset, - const char *format) /* Points to first char of set. */ + char *format) /* Points to first char of set. */ { Tcl_UniChar ch, start; int offset, nranges; - const char *end; + char *end; memset(cset, 0, sizeof(CharSet)); @@ -101,9 +101,10 @@ BuildCharSet( end += Tcl_UtfToUniChar(end, &ch); } - cset->chars = ckalloc(sizeof(Tcl_UniChar) * (end - format - 1)); + cset->chars = (Tcl_UniChar *) + ckalloc(sizeof(Tcl_UniChar) * (end - format - 1)); if (nranges > 0) { - cset->ranges = ckalloc(sizeof(struct Range) * nranges); + cset->ranges = (struct Range *) ckalloc(sizeof(struct Range)*nranges); } else { cset->ranges = NULL; } @@ -223,9 +224,9 @@ static void ReleaseCharSet( CharSet *cset) { - ckfree(cset->chars); + ckfree((char *)cset->chars); if (cset->ranges) { - ckfree(cset->ranges); + ckfree((char *)cset->ranges); } } @@ -249,7 +250,7 @@ ReleaseCharSet( static int ValidateFormat( Tcl_Interp *interp, /* Current interpreter. */ - const char *format, /* The format string. */ + char *format, /* The format string. */ int numVars, /* The number of variables passed to the scan * command. */ int *totalSubs) /* The number of variables that will be @@ -259,12 +260,8 @@ ValidateFormat( char *end; Tcl_UniChar ch; int objIndex, xpgSize, nspace = numVars; - int *nassign = TclStackAlloc(interp, nspace * sizeof(int)); + int *nassign = (int *) TclStackAlloc(interp, nspace * sizeof(int)); char buf[TCL_UTF_MAX+1]; - Tcl_Obj *errorMsg; /* Place to build an error messages. Note that - * these are messy operations because we do - * not want to use the formatting engine; - * we're inside there! */ /* * Initialize an array that records the number of times a variable is @@ -332,10 +329,9 @@ ValidateFormat( gotSequential = 1; if (gotXpg) { mixedXPG: - Tcl_SetObjResult(interp, Tcl_NewStringObj( + Tcl_SetResult(interp, "cannot mix \"%\" and \"%n$\" conversion specifiers", - -1)); - Tcl_SetErrorCode(interp, "TCL", "FORMAT", "MIXEDSPECTYPES", NULL); + TCL_STATIC); goto error; } @@ -345,7 +341,7 @@ ValidateFormat( */ if ((ch < 0x80) && isdigit(UCHAR(ch))) { /* INTL: "C" locale. */ - value = strtoul(format-1, (char **) &format, 10); /* INTL: "C" locale. */ + value = strtoul(format-1, &format, 10); /* INTL: "C" locale. */ flags |= SCAN_WIDTH; format += Tcl_UtfToUniChar(format, &ch); } @@ -379,10 +375,9 @@ ValidateFormat( switch (ch) { case 'c': if (flags & SCAN_WIDTH) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( + Tcl_SetResult(interp, "field width may not be specified in %c conversion", - -1)); - Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BADWIDTH", NULL); + TCL_STATIC); goto error; } /* @@ -393,12 +388,9 @@ ValidateFormat( if (flags & (SCAN_LONGER|SCAN_BIG)) { invalidFieldSize: buf[Tcl_UniCharToUtf(ch, buf)] = '\0'; - errorMsg = Tcl_NewStringObj( - "field size modifier may not be specified in %", -1); - Tcl_AppendToObj(errorMsg, buf, -1); - Tcl_AppendToObj(errorMsg, " conversion", -1); - Tcl_SetObjResult(interp, errorMsg); - Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BADSIZE", NULL); + Tcl_AppendResult(interp, + "field size modifier may not be specified in %", buf, + " conversion", NULL); goto error; } /* @@ -414,13 +406,11 @@ ValidateFormat( case 'o': case 'x': case 'X': - case 'b': break; case 'u': if (flags & SCAN_BIG) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "unsigned bignum scans are invalid", -1)); - Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BADUNSIGNED",NULL); + Tcl_SetResult(interp, + "unsigned bignum scans are invalid", TCL_STATIC); goto error; } break; @@ -455,19 +445,18 @@ ValidateFormat( } break; badSet: - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "unmatched [ in format string", -1)); - Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BRACKET", NULL); + Tcl_SetResult(interp, "unmatched [ in format string", + TCL_STATIC); goto error; default: - buf[Tcl_UniCharToUtf(ch, buf)] = '\0'; - errorMsg = Tcl_NewStringObj( - "bad scan conversion character \"", -1); - Tcl_AppendToObj(errorMsg, buf, -1); - Tcl_AppendToObj(errorMsg, "\"", -1); - Tcl_SetObjResult(interp, errorMsg); - Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BADTYPE", NULL); - goto error; + { + char buf[TCL_UTF_MAX+1]; + + buf[Tcl_UniCharToUtf(ch, buf)] = '\0'; + Tcl_AppendResult(interp, "bad scan conversion character \"", + buf, "\"", NULL); + goto error; + } } if (!(flags & SCAN_SUPPRESS)) { if (objIndex >= nspace) { @@ -483,7 +472,7 @@ ValidateFormat( } else { nspace += 16; /* formerly STATIC_LIST_SIZE */ } - nassign = TclStackRealloc(interp, nassign, + nassign = (int *) TclStackRealloc(interp, nassign, nspace * sizeof(int)); for (i = value; i < nspace; i++) { nassign[i] = 0; @@ -510,10 +499,9 @@ ValidateFormat( } for (i = 0; i < numVars; i++) { if (nassign[i] > 1) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( + Tcl_SetResult(interp, "variable is assigned by multiple \"%n$\" conversion specifiers", - -1)); - Tcl_SetErrorCode(interp, "TCL", "FORMAT", "POLYASSIGNED", NULL); + TCL_STATIC); goto error; } else if (!xpgSize && (nassign[i] == 0)) { /* @@ -521,10 +509,9 @@ ValidateFormat( * and/or numVars != 0), then too many vars were given */ - Tcl_SetObjResult(interp, Tcl_NewStringObj( + Tcl_SetResult(interp, "variable is not assigned by any conversion specifiers", - -1)); - Tcl_SetErrorCode(interp, "TCL", "FORMAT", "UNASSIGNED", NULL); + TCL_STATIC); goto error; } } @@ -534,14 +521,12 @@ ValidateFormat( badIndex: if (gotXpg) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\"%n$\" argument index out of range", -1)); - Tcl_SetErrorCode(interp, "TCL", "FORMAT", "INDEXRANGE", NULL); + Tcl_SetResult(interp, "\"%n$\" argument index out of range", + TCL_STATIC); } else { - Tcl_SetObjResult(interp, Tcl_NewStringObj( + Tcl_SetResult(interp, "different numbers of variable names and field specifiers", - -1)); - Tcl_SetErrorCode(interp, "TCL", "FORMAT", "FIELDVARMISMATCH", NULL); + TCL_STATIC); } error: @@ -569,16 +554,16 @@ ValidateFormat( /* ARGSUSED */ int Tcl_ScanObjCmd( - ClientData dummy, /* Not used. */ + ClientData dummy, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ - Tcl_Obj *const objv[]) /* Argument objects. */ + Tcl_Obj *CONST objv[]) /* Argument objects. */ { - const char *format; + char *format; int numVars, nconversions, totalVars = -1; int objIndex, offset, i, result, code; long value; - const char *string, *end, *baseString; + CONST char *string, *end, *baseString; char op = 0; int width, underflow = 0; Tcl_WideInt wideValue; @@ -591,7 +576,7 @@ Tcl_ScanObjCmd( if (objc < 3) { Tcl_WrongNumArgs(interp, 1, objv, - "string format ?varName ...?"); + "string format ?varName varName ...?"); return TCL_ERROR; } @@ -611,7 +596,7 @@ Tcl_ScanObjCmd( */ if (totalVars > 0) { - objs = ckalloc(sizeof(Tcl_Obj *) * totalVars); + objs = (Tcl_Obj **) ckalloc(sizeof(Tcl_Obj*) * totalVars); for (i = 0; i < totalVars; i++) { objs[i] = NULL; } @@ -691,7 +676,7 @@ Tcl_ScanObjCmd( */ if ((ch < 0x80) && isdigit(UCHAR(ch))) { /* INTL: "C" locale. */ - width = (int) strtoul(format-1, (char **) &format, 10);/* INTL: "C" locale. */ + width = (int) strtoul(format-1, &format, 10);/* INTL: "C" locale. */ format += Tcl_UtfToUniChar(format, &ch); } else { width = 0; @@ -727,7 +712,6 @@ Tcl_ScanObjCmd( if (!(flags & SCAN_SUPPRESS)) { objPtr = Tcl_NewIntObj(string - baseString); Tcl_IncrRefCount(objPtr); - CLANG_ASSERT(objs); objs[objIndex++] = objPtr; } nconversions++; @@ -750,10 +734,6 @@ Tcl_ScanObjCmd( op = 'i'; parseFlag |= TCL_PARSE_HEXADECIMAL_ONLY; break; - case 'b': - op = 'i'; - parseFlag |= TCL_PARSE_BINARY_ONLY; - break; case 'u': op = 'i'; parseFlag |= TCL_PARSE_DECIMAL_ONLY; @@ -838,7 +818,6 @@ Tcl_ScanObjCmd( if (!(flags & SCAN_SUPPRESS)) { objPtr = Tcl_NewStringObj(string, end-string); Tcl_IncrRefCount(objPtr); - CLANG_ASSERT(objs); objs[objIndex++] = objPtr; } string = end; @@ -889,7 +868,6 @@ Tcl_ScanObjCmd( if (!(flags & SCAN_SUPPRESS)) { objPtr = Tcl_NewIntObj((int)sch); Tcl_IncrRefCount(objPtr); - CLANG_ASSERT(objs); objs[objIndex++] = objPtr; } break; @@ -994,7 +972,6 @@ Tcl_ScanObjCmd( } } Tcl_SetDoubleObj(objPtr, dvalue); - CLANG_ASSERT(objs); objs[objIndex++] = objPtr; string = end; } @@ -1016,14 +993,9 @@ Tcl_ScanObjCmd( continue; } result++; - - /* - * In case of multiple errors in setting variables, just report - * the first one. - */ - - if (Tcl_ObjSetVar2(interp, objv[i+3], NULL, objs[i], - (code == TCL_OK) ? TCL_LEAVE_ERR_MSG : 0) == NULL) { + if (Tcl_ObjSetVar2(interp, objv[i+3], NULL, objs[i], 0) == NULL) { + Tcl_AppendResult(interp, "couldn't set variable \"", + TclGetString(objv[i+3]), "\"", NULL); code = TCL_ERROR; } Tcl_DecrRefCount(objs[i]); @@ -1049,7 +1021,7 @@ Tcl_ScanObjCmd( } } if (objs != NULL) { - ckfree(objs); + ckfree((char*) objs); } if (code == TCL_OK) { if (underflow && (nconversions == 0)) { |