diff options
Diffstat (limited to 'generic/tclClock.c')
| -rw-r--r-- | generic/tclClock.c | 489 | 
1 files changed, 244 insertions, 245 deletions
| diff --git a/generic/tclClock.c b/generic/tclClock.c index d32e786..15f29e5 100644 --- a/generic/tclClock.c +++ b/generic/tclClock.c @@ -7,12 +7,10 @@   *   * Copyright 1991-1995 Karl Lehenbauer and Mark Diekhans.   * Copyright (c) 1995 Sun Microsystems, Inc. - * Copyright (c) 2004 by Kevin B. Kenny.  All rights reserved. + * Copyright (c) 2004 by Kevin B. Kenny. All rights reserved.   *   * See the file "license.terms" for information on usage and redistribution of   * this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tclClock.c,v 1.70 2008/07/21 21:25:21 nijtmans Exp $   */  #include "tclInt.h" @@ -21,7 +19,7 @@   * Windows has mktime. The configurators do not check.   */ -#ifdef __WIN32__ +#ifdef _WIN32  #define HAVE_MKTIME 1  #endif @@ -33,12 +31,12 @@  #define SECONDS_PER_DAY			86400  #define JULIAN_SEC_POSIX_EPOCH	      (((Tcl_WideInt) JULIAN_DAY_POSIX_EPOCH) \  					* SECONDS_PER_DAY) -#define FOUR_CENTURIES			146097 /* days */ +#define FOUR_CENTURIES			146097	/* days */  #define JDAY_1_JAN_1_CE_JULIAN		1721424  #define JDAY_1_JAN_1_CE_GREGORIAN	1721426 -#define ONE_CENTURY_GREGORIAN		36524  /* days */ -#define FOUR_YEARS			1461   /* days */ -#define ONE_YEAR			365    /* days */ +#define ONE_CENTURY_GREGORIAN		36524	/* days */ +#define FOUR_YEARS			1461	/* days */ +#define ONE_YEAR			365	/* days */  /*   * Table of the days in each month, leap and common years @@ -94,8 +92,8 @@ static const char *const literals[] = {   */  typedef struct ClockClientData { -    int refCount;		/* Number of live references */ -    Tcl_Obj** literals;		/* Pool of object literals */ +    int refCount;		/* Number of live references. */ +    Tcl_Obj **literals;		/* Pool of object literals. */  } ClockClientData;  /* @@ -109,7 +107,7 @@ typedef struct TclDateFields {  				 * from the Posix epoch */      int tzOffset;		/* Time zone offset in seconds east of  				 * Greenwich */ -    Tcl_Obj* tzName;		/* Time zone name */ +    Tcl_Obj *tzName;		/* Time zone name */      int julianDay;		/* Julian Day Number in local time zone */      enum {BCE=1, CE=0} era;	/* Era */      int gregorian;		/* Flag == 1 if the date is Gregorian */ @@ -121,7 +119,7 @@ typedef struct TclDateFields {      int iso8601Week;		/* ISO8601 week number */      int dayOfWeek;		/* Day of the week */  } TclDateFields; -static const char* eras[] = { "CE", "BCE", NULL }; +static const char *const eras[] = { "CE", "BCE", NULL };  /*   * Thread specific data block holding a 'struct tm' for the 'gmtime' and @@ -141,26 +139,26 @@ TCL_DECLARE_MUTEX(clockMutex)   * Function prototypes for local procedures in this file:   */ -static int		ConvertUTCToLocal(Tcl_Interp*, -			    TclDateFields*, Tcl_Obj*, int); -static int		ConvertUTCToLocalUsingTable(Tcl_Interp*, -			    TclDateFields*, int, Tcl_Obj *const[]); -static int		ConvertUTCToLocalUsingC(Tcl_Interp*, -			    TclDateFields*, int); -static int		ConvertLocalToUTC(Tcl_Interp*, -			    TclDateFields*, Tcl_Obj*, int); -static int		ConvertLocalToUTCUsingTable(Tcl_Interp*, -			    TclDateFields*, int, Tcl_Obj *const[]); -static int		ConvertLocalToUTCUsingC(Tcl_Interp*, -			    TclDateFields*, int); -static Tcl_Obj*		LookupLastTransition(Tcl_Interp*, Tcl_WideInt, +static int		ConvertUTCToLocal(Tcl_Interp *, +			    TclDateFields *, Tcl_Obj *, int); +static int		ConvertUTCToLocalUsingTable(Tcl_Interp *, +			    TclDateFields *, int, Tcl_Obj *const[]); +static int		ConvertUTCToLocalUsingC(Tcl_Interp *, +			    TclDateFields *, int); +static int		ConvertLocalToUTC(Tcl_Interp *, +			    TclDateFields *, Tcl_Obj *, int); +static int		ConvertLocalToUTCUsingTable(Tcl_Interp *, +			    TclDateFields *, int, Tcl_Obj *const[]); +static int		ConvertLocalToUTCUsingC(Tcl_Interp *, +			    TclDateFields *, int); +static Tcl_Obj *	LookupLastTransition(Tcl_Interp *, Tcl_WideInt,  			    int, Tcl_Obj *const *); -static void		GetYearWeekDay(TclDateFields*, int); -static void		GetGregorianEraYearDay(TclDateFields*, int); -static void		GetMonthDay(TclDateFields*); -static void		GetJulianDayFromEraYearWeekDay(TclDateFields*, int); -static void		GetJulianDayFromEraYearMonthDay(TclDateFields*, int); -static int		IsGregorianLeapYear(TclDateFields*); +static void		GetYearWeekDay(TclDateFields *, int); +static void		GetGregorianEraYearDay(TclDateFields *, int); +static void		GetMonthDay(TclDateFields *); +static void		GetJulianDayFromEraYearWeekDay(TclDateFields *, int); +static void		GetJulianDayFromEraYearMonthDay(TclDateFields *, int); +static int		IsGregorianLeapYear(TclDateFields *);  static int		WeekdayOnOrBefore(int, int);  static int		ClockClicksObjCmd(  			    ClientData clientData, Tcl_Interp *interp, @@ -187,7 +185,7 @@ static int		ClockMillisecondsObjCmd(  			    ClientData clientData, Tcl_Interp *interp,  			    int objc, Tcl_Obj *const objv[]);  static int		ClockParseformatargsObjCmd( -			    ClientData clientData, Tcl_Interp* interp, +			    ClientData clientData, Tcl_Interp *interp,  			    int objc, Tcl_Obj *const objv[]);  static int		ClockSecondsObjCmd(  			    ClientData clientData, Tcl_Interp *interp, @@ -221,11 +219,11 @@ static const struct ClockCommand clockCommands[] = {      { "GetJulianDayFromEraYearMonthDay",  		ClockGetjuliandayfromerayearmonthdayObjCmd },      { "GetJulianDayFromEraYearWeekDay", -    		ClockGetjuliandayfromerayearweekdayObjCmd }, +		ClockGetjuliandayfromerayearweekdayObjCmd },      { "ParseFormatArgs",	ClockParseformatargsObjCmd },      { NULL, NULL }  }; - +  /*   *----------------------------------------------------------------------   * @@ -251,17 +249,26 @@ TclClockInit(      const struct ClockCommand *clockCmdPtr;      char cmdName[50];		/* Buffer large enough to hold the string  				 *::tcl::clock::GetJulianDayFromEraYearMonthDay -				 * plus a terminating NULL. */ +				 * plus a terminating NUL. */      ClockClientData *data;      int i;      /* +     * Safe interps get [::clock] as alias to a master, so do not need their +     * own copies of the support routines. +     */ + +    if (Tcl_IsSafe(interp)) { +	return; +    } + +    /*       * Create the client data, which is a refcounted literal pool.       */ -    data = (ClockClientData *) ckalloc(sizeof(ClockClientData)); +    data = ckalloc(sizeof(ClockClientData));      data->refCount = 0; -    data->literals = (Tcl_Obj**) ckalloc(LIT__END * sizeof(Tcl_Obj*)); +    data->literals = ckalloc(LIT__END * sizeof(Tcl_Obj*));      for (i = 0; i < LIT__END; ++i) {  	data->literals[i] = Tcl_NewStringObj(literals[i], -1);  	Tcl_IncrRefCount(data->literals[i]); @@ -271,8 +278,8 @@ TclClockInit(       * Install the commands.       */ -    strcpy(cmdName, "::tcl::clock::");  #define TCL_CLOCK_PREFIX_LEN 14 /* == strlen("::tcl::clock::") */ +    memcpy(cmdName, "::tcl::clock::", TCL_CLOCK_PREFIX_LEN);      for (clockCmdPtr=clockCommands ; clockCmdPtr->name!=NULL ; clockCmdPtr++) {  	strcpy(cmdName + TCL_CLOCK_PREFIX_LEN, clockCmdPtr->name);  	data->refCount++; @@ -280,7 +287,7 @@ TclClockInit(  		ClockDeleteCmdProc);      }  } - +  /*   *----------------------------------------------------------------------   * @@ -310,15 +317,15 @@ TclClockInit(  static int  ClockConvertlocaltoutcObjCmd( -    ClientData clientData,	/* Client data  */ -    Tcl_Interp* interp,		/* Tcl interpreter */ +    ClientData clientData,	/* Client data */ +    Tcl_Interp *interp,		/* Tcl interpreter */      int objc,			/* Parameter count */      Tcl_Obj *const *objv)	/* Parameter vector */  { -    ClockClientData* data = (ClockClientData*) clientData; -    Tcl_Obj* const * literals = data->literals; -    Tcl_Obj* secondsObj; -    Tcl_Obj* dict; +    ClockClientData *data = clientData; +    Tcl_Obj *const *literals = data->literals; +    Tcl_Obj *secondsObj; +    Tcl_Obj *dict;      int changeover;      TclDateFields fields;      int created = 0; @@ -334,16 +341,16 @@ ClockConvertlocaltoutcObjCmd(      }      dict = objv[1];      if (Tcl_DictObjGet(interp, dict, literals[LIT_LOCALSECONDS], -		       &secondsObj)!= TCL_OK) { +	    &secondsObj)!= TCL_OK) {  	return TCL_ERROR;      }      if (secondsObj == NULL) {  	Tcl_SetObjResult(interp, Tcl_NewStringObj("key \"localseconds\" not " -						  "found in dictionary", -1)); +		"found in dictionary", -1));  	return TCL_ERROR;      }      if ((Tcl_GetWideIntFromObj(interp, secondsObj, -			      &(fields.localSeconds)) != TCL_OK) +	    &fields.localSeconds) != TCL_OK)  	|| (TclGetIntFromObj(interp, objv[3], &changeover) != TCL_OK)  	|| ConvertLocalToUTC(interp, &fields, objv[2], changeover)) {  	return TCL_ERROR; @@ -369,7 +376,7 @@ ClockConvertlocaltoutcObjCmd(      }      return status;  } - +  /*   *----------------------------------------------------------------------   * @@ -383,16 +390,16 @@ ClockConvertlocaltoutcObjCmd(   *   * Parameters:   *	seconds - Time expressed in seconds from the Posix epoch. - *	tzdata - Time zone data of the time zone in which time is to - *                 be expressed. + *	tzdata - Time zone data of the time zone in which time is to be + *		 expressed.   *	changeover - Julian Day Number at which the current locale adopted   *		     the Gregorian calendar   *   * Results:   *	Returns a dictonary populated with the fields:   *		seconds - Seconds from the Posix epoch - *		localSeconds - Nominal seconds from the Posix epoch in - *			       the local time zone. + *		localSeconds - Nominal seconds from the Posix epoch in the + *			       local time zone.   *		tzOffset - Time zone offset in seconds east of Greenwich   *		tzName - Time zone name   *		julianDay - Julian Day Number in the local time zone @@ -403,14 +410,14 @@ ClockConvertlocaltoutcObjCmd(  int  ClockGetdatefieldsObjCmd(      ClientData clientData,	/* Opaque pointer to literal pool, etc. */ -    Tcl_Interp* interp,		/* Tcl interpreter */ +    Tcl_Interp *interp,		/* Tcl interpreter */      int objc,			/* Parameter count */      Tcl_Obj *const *objv)	/* Parameter vector */  {      TclDateFields fields; -    Tcl_Obj* dict; -    ClockClientData* data = (ClockClientData*) clientData; -    Tcl_Obj* const * literals = data->literals; +    Tcl_Obj *dict; +    ClockClientData *data = clientData; +    Tcl_Obj *const *literals = data->literals;      int changeover;      /* @@ -421,14 +428,14 @@ ClockGetdatefieldsObjCmd(  	Tcl_WrongNumArgs(interp, 1, objv, "seconds tzdata changeover");  	return TCL_ERROR;      } -    if (Tcl_GetWideIntFromObj(interp, objv[1], &(fields.seconds)) != TCL_OK +    if (Tcl_GetWideIntFromObj(interp, objv[1], &fields.seconds) != TCL_OK  	    || TclGetIntFromObj(interp, objv[3], &changeover) != TCL_OK) {  	return TCL_ERROR;      }      /* -     * fields.seconds could be an unsigned number that overflowed.  Make -     * sure that it isn't. +     * fields.seconds could be an unsigned number that overflowed. Make sure +     * that it isn't.       */      if (objv[1]->typePtr == &tclBignumType) { @@ -492,7 +499,7 @@ ClockGetdatefieldsObjCmd(      return TCL_OK;  } - +  /*   *----------------------------------------------------------------------   * @@ -515,17 +522,17 @@ ClockGetdatefieldsObjCmd(   */  static int -ClockGetjuliandayfromerayearmonthdayObjCmd ( +ClockGetjuliandayfromerayearmonthdayObjCmd(      ClientData clientData,	/* Opaque pointer to literal pool, etc. */ -    Tcl_Interp* interp,		/* Tcl interpreter */ +    Tcl_Interp *interp,		/* Tcl interpreter */      int objc,			/* Parameter count */      Tcl_Obj *const *objv)	/* Parameter vector */  {      TclDateFields fields; -    Tcl_Obj* dict; -    ClockClientData* data = (ClockClientData*) clientData; -    Tcl_Obj* const * literals = data->literals; -    Tcl_Obj* fieldPtr; +    Tcl_Obj *dict; +    ClockClientData *data = clientData; +    Tcl_Obj *const *literals = data->literals; +    Tcl_Obj *fieldPtr;      int changeover;      int copied = 0;      int status; @@ -541,19 +548,21 @@ ClockGetjuliandayfromerayearmonthdayObjCmd (      }      dict = objv[1];      if (Tcl_DictObjGet(interp, dict, literals[LIT_ERA], &fieldPtr) != TCL_OK +		 || fieldPtr == NULL  	    || Tcl_GetIndexFromObj(interp, fieldPtr, eras, "era", TCL_EXACT,  		&era) != TCL_OK -	    || Tcl_DictObjGet(interp, dict, literals[LIT_YEAR], -		&fieldPtr) != TCL_OK -	    || TclGetIntFromObj(interp, fieldPtr, &(fields.year)) != TCL_OK -	    || Tcl_DictObjGet(interp, dict, literals[LIT_MONTH], -		&fieldPtr) != TCL_OK -	    || TclGetIntFromObj(interp, fieldPtr, &(fields.month)) != TCL_OK -	    || Tcl_DictObjGet(interp, dict, literals[LIT_DAYOFMONTH], -		&fieldPtr) != TCL_OK -	    || TclGetIntFromObj(interp, fieldPtr, -		&(fields.dayOfMonth)) != TCL_OK +	    || Tcl_DictObjGet(interp, dict, literals[LIT_YEAR], &fieldPtr) != TCL_OK +		 || fieldPtr == NULL +	    || TclGetIntFromObj(interp, fieldPtr, &fields.year) != TCL_OK +	    || Tcl_DictObjGet(interp, dict, literals[LIT_MONTH],	&fieldPtr) != TCL_OK +		 || fieldPtr == NULL +	    || TclGetIntFromObj(interp, fieldPtr, &fields.month) != TCL_OK +	    || Tcl_DictObjGet(interp, dict, literals[LIT_DAYOFMONTH], &fieldPtr) != TCL_OK +		 || fieldPtr == NULL +	    || TclGetIntFromObj(interp, fieldPtr, &fields.dayOfMonth)!=TCL_OK  	    || TclGetIntFromObj(interp, objv[2], &changeover) != TCL_OK) { +    if (fieldPtr == NULL) +	Tcl_SetObjResult(interp, Tcl_NewStringObj("expected key(s) not found in dictionary", -1));  	return TCL_ERROR;      }      fields.era = era; @@ -583,7 +592,7 @@ ClockGetjuliandayfromerayearmonthdayObjCmd (      }      return status;  } - +  /*   *----------------------------------------------------------------------   * @@ -606,17 +615,17 @@ ClockGetjuliandayfromerayearmonthdayObjCmd (   */  static int -ClockGetjuliandayfromerayearweekdayObjCmd ( +ClockGetjuliandayfromerayearweekdayObjCmd(      ClientData clientData,	/* Opaque pointer to literal pool, etc. */ -    Tcl_Interp* interp,		/* Tcl interpreter */ +    Tcl_Interp *interp,		/* Tcl interpreter */      int objc,			/* Parameter count */      Tcl_Obj *const *objv)	/* Parameter vector */  {      TclDateFields fields; -    Tcl_Obj* dict; -    ClockClientData* data = (ClockClientData*) clientData; -    Tcl_Obj* const * literals = data->literals; -    Tcl_Obj* fieldPtr; +    Tcl_Obj *dict; +    ClockClientData *data = clientData; +    Tcl_Obj *const *literals = data->literals; +    Tcl_Obj *fieldPtr;      int changeover;      int copied = 0;      int status; @@ -632,21 +641,21 @@ ClockGetjuliandayfromerayearweekdayObjCmd (      }      dict = objv[1];      if (Tcl_DictObjGet(interp, dict, literals[LIT_ERA], &fieldPtr) != TCL_OK +		 || fieldPtr == NULL  	    || Tcl_GetIndexFromObj(interp, fieldPtr, eras, "era", TCL_EXACT,  		&era) != TCL_OK -	    || Tcl_DictObjGet(interp, dict, literals[LIT_ISO8601YEAR], -		&fieldPtr) != TCL_OK -	    || TclGetIntFromObj(interp, fieldPtr, -		&(fields.iso8601Year)) != TCL_OK -	    || Tcl_DictObjGet(interp, dict, literals[LIT_ISO8601WEEK], -		&fieldPtr) != TCL_OK -	    || TclGetIntFromObj(interp, fieldPtr, -		&(fields.iso8601Week)) != TCL_OK -	    || Tcl_DictObjGet(interp, dict, literals[LIT_DAYOFWEEK], -		&fieldPtr) != TCL_OK -	    || TclGetIntFromObj(interp, fieldPtr, -		&(fields.dayOfWeek)) != TCL_OK +	    || Tcl_DictObjGet(interp, dict, literals[LIT_ISO8601YEAR], &fieldPtr) != TCL_OK +		 || fieldPtr == NULL +	    || TclGetIntFromObj(interp, fieldPtr, &(fields.iso8601Year)) != TCL_OK +	    || Tcl_DictObjGet(interp, dict, literals[LIT_ISO8601WEEK], &fieldPtr) != TCL_OK +		 || fieldPtr == NULL +	    || TclGetIntFromObj(interp, fieldPtr, &(fields.iso8601Week)) != TCL_OK +	    || Tcl_DictObjGet(interp, dict, literals[LIT_DAYOFWEEK], &fieldPtr) != TCL_OK +		 || fieldPtr == NULL +	    || TclGetIntFromObj(interp, fieldPtr, &(fields.dayOfWeek)) != TCL_OK  	    || TclGetIntFromObj(interp, objv[2], &changeover) != TCL_OK) { +    if (fieldPtr == NULL) +	Tcl_SetObjResult(interp, Tcl_NewStringObj("expected key(s) not found in dictionary", -1));  	return TCL_ERROR;      }      fields.era = era; @@ -676,7 +685,7 @@ ClockGetjuliandayfromerayearweekdayObjCmd (      }      return status;  } - +  /*   *----------------------------------------------------------------------   * @@ -697,13 +706,13 @@ ClockGetjuliandayfromerayearweekdayObjCmd (  static int  ConvertLocalToUTC( -    Tcl_Interp* interp,		/* Tcl interpreter */ -    TclDateFields* fields,	/* Fields of the time */ -    Tcl_Obj* tzdata,		/* Time zone data */ +    Tcl_Interp *interp,		/* Tcl interpreter */ +    TclDateFields *fields,	/* Fields of the time */ +    Tcl_Obj *tzdata,		/* Time zone data */      int changeover)		/* Julian Day of the Gregorian transition */  {      int rowc;			/* Number of rows in tzdata */ -    Tcl_Obj** rowv;		/* Pointers to the rows */ +    Tcl_Obj **rowv;		/* Pointers to the rows */      /*       * Unpack the tz data. @@ -724,7 +733,7 @@ ConvertLocalToUTC(  	return ConvertLocalToUTCUsingTable(interp, fields, rowc, rowv);      }  } - +  /*   *----------------------------------------------------------------------   * @@ -745,14 +754,14 @@ ConvertLocalToUTC(  static int  ConvertLocalToUTCUsingTable( -    Tcl_Interp* interp,		/* Tcl interpreter */ -    TclDateFields* fields,	/* Time to convert, with 'seconds' filled in */ +    Tcl_Interp *interp,		/* Tcl interpreter */ +    TclDateFields *fields,	/* Time to convert, with 'seconds' filled in */      int rowc,			/* Number of points at which time changes */      Tcl_Obj *const rowv[])	/* Points at which time changes */  { -    Tcl_Obj* row; +    Tcl_Obj *row;      int cellc; -    Tcl_Obj** cellv; +    Tcl_Obj **cellv;      int have[8];      int nHave = 0;      int i; @@ -777,7 +786,7 @@ ConvertLocalToUTCUsingTable(  		|| TclListObjGetElements(interp, row, &cellc,  		    &cellv) != TCL_OK  		|| TclGetIntFromObj(interp, cellv[1], -		    &(fields->tzOffset)) != TCL_OK) { +		    &fields->tzOffset) != TCL_OK) {  	    return TCL_ERROR;  	}  	found = 0; @@ -791,8 +800,7 @@ ConvertLocalToUTCUsingTable(  	    if (nHave == 8) {  		Tcl_Panic("loop in ConvertLocalToUTCUsingTable");  	    } -	    have[nHave] = fields->tzOffset; -	    ++nHave; +	    have[nHave++] = fields->tzOffset;  	}  	fields->seconds = fields->localSeconds - fields->tzOffset;      } @@ -800,7 +808,7 @@ ConvertLocalToUTCUsingTable(      fields->seconds = fields->localSeconds - fields->tzOffset;      return TCL_OK;  } - +  /*   *----------------------------------------------------------------------   * @@ -821,8 +829,8 @@ ConvertLocalToUTCUsingTable(  static int  ConvertLocalToUTCUsingC( -    Tcl_Interp* interp,		/* Tcl interpreter */ -    TclDateFields* fields,	/* Time to convert, with 'seconds' filled in */ +    Tcl_Interp *interp,		/* Tcl interpreter */ +    TclDateFields *fields,	/* Time to convert, with 'seconds' filled in */      int changeover)		/* Julian Day of the Gregorian transition */  {      struct tm timeVal; @@ -839,7 +847,7 @@ ConvertLocalToUTCUsingC(      secondOfDay = (int)(jsec % SECONDS_PER_DAY);      if (secondOfDay < 0) {  	secondOfDay += SECONDS_PER_DAY; -	--fields->julianDay; +	fields->julianDay--;      }      GetGregorianEraYearDay(fields, changeover);      GetMonthDay(fields); @@ -876,13 +884,13 @@ ConvertLocalToUTCUsingC(      if (localErrno != 0  	    || (fields->seconds == -1 && timeVal.tm_yday == -1)) { -	Tcl_SetResult(interp, "time value too large/small to represent", -		TCL_STATIC); +	Tcl_SetObjResult(interp, Tcl_NewStringObj( +		"time value too large/small to represent", -1));  	return TCL_ERROR;      }      return TCL_OK;  } - +  /*   *----------------------------------------------------------------------   * @@ -901,13 +909,13 @@ ConvertLocalToUTCUsingC(  static int  ConvertUTCToLocal( -    Tcl_Interp* interp,		/* Tcl interpreter */ -    TclDateFields* fields,	/* Fields of the time */ -    Tcl_Obj* tzdata,		/* Time zone data */ +    Tcl_Interp *interp,		/* Tcl interpreter */ +    TclDateFields *fields,	/* Fields of the time */ +    Tcl_Obj *tzdata,		/* Time zone data */      int changeover)		/* Julian Day of the Gregorian transition */  {      int rowc;			/* Number of rows in tzdata */ -    Tcl_Obj** rowv;		/* Pointers to the rows */ +    Tcl_Obj **rowv;		/* Pointers to the rows */      /*       * Unpack the tz data. @@ -928,7 +936,7 @@ ConvertUTCToLocal(  	return ConvertUTCToLocalUsingTable(interp, fields, rowc, rowv);      }  } - +  /*   *----------------------------------------------------------------------   * @@ -949,15 +957,15 @@ ConvertUTCToLocal(  static int  ConvertUTCToLocalUsingTable( -    Tcl_Interp* interp,		/* Tcl interpreter */ -    TclDateFields* fields,	/* Fields of the date */ +    Tcl_Interp *interp,		/* Tcl interpreter */ +    TclDateFields *fields,	/* Fields of the date */      int rowc,			/* Number of rows in the conversion table  				 * (>= 1) */      Tcl_Obj *const rowv[])	/* Rows of the conversion table */  { -    Tcl_Obj* row;		/* Row containing the current information */ +    Tcl_Obj *row;		/* Row containing the current information */      int cellc;			/* Count of cells in the row (must be 4) */ -    Tcl_Obj** cellv;		/* Pointers to the cells */ +    Tcl_Obj **cellv;		/* Pointers to the cells */      /*       * Look up the nearest transition time. @@ -966,7 +974,7 @@ ConvertUTCToLocalUsingTable(      row = LookupLastTransition(interp, fields->seconds, rowc, rowv);      if (row == NULL ||  	    TclListObjGetElements(interp, row, &cellc, &cellv) != TCL_OK || -	    TclGetIntFromObj(interp,cellv[1],&(fields->tzOffset)) != TCL_OK) { +	    TclGetIntFromObj(interp, cellv[1], &fields->tzOffset) != TCL_OK) {  	return TCL_ERROR;      } @@ -979,7 +987,7 @@ ConvertUTCToLocalUsingTable(      fields->localSeconds = fields->seconds + fields->tzOffset;      return TCL_OK;  } - +  /*   *----------------------------------------------------------------------   * @@ -1001,12 +1009,12 @@ ConvertUTCToLocalUsingTable(  static int  ConvertUTCToLocalUsingC( -    Tcl_Interp* interp,		/* Tcl interpreter */ -    TclDateFields* fields,	/* Time to convert, with 'seconds' filled in */ +    Tcl_Interp *interp,		/* Tcl interpreter */ +    TclDateFields *fields,	/* Time to convert, with 'seconds' filled in */      int changeover)		/* Julian Day of the Gregorian transition */  {      time_t tock; -    struct tm* timeVal;		/* Time after conversion */ +    struct tm *timeVal;		/* Time after conversion */      int diff;			/* Time zone diff local-Greenwich */      char buffer[8];		/* Buffer for time zone name */ @@ -1016,17 +1024,17 @@ ConvertUTCToLocalUsingC(      tock = (time_t) fields->seconds;      if ((Tcl_WideInt) tock != fields->seconds) { -	Tcl_AppendResult(interp, -		"number too large to represent as a Posix time", NULL); +	Tcl_SetObjResult(interp, Tcl_NewStringObj( +		"number too large to represent as a Posix time", -1));  	Tcl_SetErrorCode(interp, "CLOCK", "argTooLarge", NULL);  	return TCL_ERROR;      }      TzsetIfNecessary();      timeVal = ThreadSafeLocalTime(&tock);      if (timeVal == NULL) { -	Tcl_AppendResult(interp, +	Tcl_SetObjResult(interp, Tcl_NewStringObj(  		"localtime failed (clock value may be too " -		"large/small to represent)", NULL); +		"large/small to represent)", -1));  	Tcl_SetErrorCode(interp, "CLOCK", "localtimeFailed", NULL);  	return TCL_ERROR;      } @@ -1072,7 +1080,7 @@ ConvertUTCToLocalUsingC(      Tcl_IncrRefCount(fields->tzName);      return TCL_OK;  } - +  /*   *----------------------------------------------------------------------   * @@ -1087,16 +1095,16 @@ ConvertUTCToLocalUsingC(   *----------------------------------------------------------------------   */ -static Tcl_Obj* +static Tcl_Obj *  LookupLastTransition( -    Tcl_Interp* interp,		/* Interpreter for error messages */ +    Tcl_Interp *interp,		/* Interpreter for error messages */      Tcl_WideInt tick,		/* Time from the epoch */      int rowc,			/* Number of rows of tzdata */      Tcl_Obj *const *rowv)	/* Rows in tzdata */  {      int l;      int u; -    Tcl_Obj* compObj; +    Tcl_Obj *compObj;      Tcl_WideInt compVal;      /* @@ -1138,7 +1146,7 @@ LookupLastTransition(      }      return rowv[l];  } - +  /*   *----------------------------------------------------------------------   * @@ -1159,7 +1167,7 @@ LookupLastTransition(  static void  GetYearWeekDay( -    TclDateFields* fields,	/* Date to convert, must have 'julianDay' */ +    TclDateFields *fields,	/* Date to convert, must have 'julianDay' */      int changeover)		/* Julian Day Number of the Gregorian  				 * transition */  { @@ -1205,7 +1213,7 @@ GetYearWeekDay(  	fields->dayOfWeek += 7;      }  } - +  /*   *----------------------------------------------------------------------   * @@ -1226,7 +1234,7 @@ GetYearWeekDay(  static void  GetGregorianEraYearDay( -    TclDateFields* fields,	/* Date fields containing 'julianDay' */ +    TclDateFields *fields,	/* Date fields containing 'julianDay' */      int changeover)		/* Gregorian transition date */  {      int jday = fields->julianDay; @@ -1252,7 +1260,7 @@ GetGregorianEraYearDay(  	day %= FOUR_CENTURIES;  	if (day < 0) {  	    day += FOUR_CENTURIES; -	    --n; +	    n--;  	}  	year += 400 * n; @@ -1272,7 +1280,6 @@ GetGregorianEraYearDay(  	    day += ONE_CENTURY_GREGORIAN;  	}  	year += 100 * n; -      } else {  	/*  	 * Julian calendar. @@ -1281,7 +1288,6 @@ GetGregorianEraYearDay(  	fields->gregorian = 0;  	year = 1;  	day = jday - JDAY_1_JAN_1_CE_JULIAN; -      }      /* @@ -1292,7 +1298,7 @@ GetGregorianEraYearDay(      day %= FOUR_YEARS;      if (day < 0) {  	day += FOUR_YEARS; -	--n; +	n--;      }      year += 4 * n; @@ -1325,7 +1331,7 @@ GetGregorianEraYearDay(      }      fields->dayOfYear = day + 1;  } - +  /*   *----------------------------------------------------------------------   * @@ -1344,11 +1350,11 @@ GetGregorianEraYearDay(  static void  GetMonthDay( -    TclDateFields* fields)	/* Date to convert */ +    TclDateFields *fields)	/* Date to convert */  {      int day = fields->dayOfYear;      int month; -    const int* h = hath[IsGregorianLeapYear(fields)]; +    const int *h = hath[IsGregorianLeapYear(fields)];      for (month = 0; month < 12 && day > h[month]; ++month) {  	day -= h[month]; @@ -1356,7 +1362,7 @@ GetMonthDay(      fields->month = month+1;      fields->dayOfMonth = day;  } - +  /*   *----------------------------------------------------------------------   * @@ -1376,18 +1382,18 @@ GetMonthDay(  static void  GetJulianDayFromEraYearWeekDay( -    TclDateFields* fields,	/* Date to convert */ +    TclDateFields *fields,	/* Date to convert */      int changeover)		/* Julian Day Number of the Gregorian  				 * transition */  {      int firstMonday;		/* Julian day number of week 1, day 1 in the  				 * given year */ +    TclDateFields firstWeek;      /*       * Find January 4 in the ISO8601 year, which will always be in week 1.       */ -    TclDateFields firstWeek;      firstWeek.era = fields->era;      firstWeek.year = fields->iso8601Year;      firstWeek.month = 1; @@ -1407,7 +1413,7 @@ GetJulianDayFromEraYearWeekDay(      fields->julianDay = firstMonday + 7 * (fields->iso8601Week - 1)  	    + fields->dayOfWeek - 1;  } - +  /*   *----------------------------------------------------------------------   * @@ -1427,13 +1433,10 @@ GetJulianDayFromEraYearWeekDay(  static void  GetJulianDayFromEraYearMonthDay( -    TclDateFields* fields,	/* Date to convert */ +    TclDateFields *fields,	/* Date to convert */      int changeover)		/* Gregorian transition date as a Julian Day */  { -    int year;  int ym1; -    int month; int mm1; -    int q; int r; -    int ym1o4; int ym1o100; int ym1o400; +    int year, ym1, month, mm1, q, r, ym1o4, ym1o100, ym1o400;      if (fields->era == BCE) {  	year = 1 - fields->year; @@ -1476,15 +1479,15 @@ GetJulianDayFromEraYearMonthDay(      ym1o4 = ym1 / 4;      if (ym1 % 4 < 0) { -	--ym1o4; +	ym1o4--;      }      ym1o100 = ym1 / 100;      if (ym1 % 100 < 0) { -	--ym1o100; +	ym1o100--;      }      ym1o400 = ym1 / 400;      if (ym1 % 400 < 0) { -	--ym1o400; +	ym1o400--;      }      fields->julianDay = JDAY_1_JAN_1_CE_GREGORIAN - 1  	    + fields->dayOfMonth @@ -1505,10 +1508,10 @@ GetJulianDayFromEraYearMonthDay(  		+ fields->dayOfMonth  		+ daysInPriorMonths[year%4 == 0][month - 1]  		+ (365 * ym1) -	        + ym1o4; +		+ ym1o4;      }  } - +  /*   *----------------------------------------------------------------------   * @@ -1525,7 +1528,7 @@ GetJulianDayFromEraYearMonthDay(  static int  IsGregorianLeapYear( -    TclDateFields* fields)	/* Date to test */ +    TclDateFields *fields)	/* Date to test */  {      int year; @@ -1546,7 +1549,7 @@ IsGregorianLeapYear(  	return 1;      }  } - +  /*   *----------------------------------------------------------------------   * @@ -1572,7 +1575,7 @@ WeekdayOnOrBefore(      }      return julianDay - ((julianDay - k) % 7);  } - +  /*   *----------------------------------------------------------------------   * @@ -1597,12 +1600,12 @@ WeekdayOnOrBefore(  int  ClockGetenvObjCmd(      ClientData clientData, -    Tcl_Interp* interp, +    Tcl_Interp *interp,      int objc,      Tcl_Obj *const objv[])  { -    const char* varName; -    const char* varValue; +    const char *varName; +    const char *varValue;      if (objc != 2) {  	Tcl_WrongNumArgs(interp, 1, objv, "name"); @@ -1616,7 +1619,7 @@ ClockGetenvObjCmd(      Tcl_SetObjResult(interp, Tcl_NewStringObj(varValue, -1));      return TCL_OK;  } - +  /*   *----------------------------------------------------------------------   * @@ -1643,8 +1646,7 @@ ThreadSafeLocalTime(       * Get a thread-local buffer to hold the returned time.       */ -    struct tm *tmPtr = (struct tm *) -	    Tcl_GetThreadData(&tmKey, (int) sizeof(struct tm)); +    struct tm *tmPtr = Tcl_GetThreadData(&tmKey, (int) sizeof(struct tm));  #ifdef HAVE_LOCALTIME_R      localtime_r(timePtr, tmPtr);  #else @@ -1655,14 +1657,13 @@ ThreadSafeLocalTime(      if (sysTmPtr == NULL) {  	Tcl_MutexUnlock(&clockMutex);  	return NULL; -    } else { -	memcpy((void *) tmPtr, (void *) localtime(timePtr), sizeof(struct tm)); -	Tcl_MutexUnlock(&clockMutex);      } +    memcpy(tmPtr, localtime(timePtr), sizeof(struct tm)); +    Tcl_MutexUnlock(&clockMutex);  #endif      return tmPtr;  } - +  /*----------------------------------------------------------------------   *   * ClockClicksObjCmd -- @@ -1684,18 +1685,19 @@ ThreadSafeLocalTime(  int  ClockClicksObjCmd(      ClientData clientData,	/* Client data is unused */ -    Tcl_Interp* interp,		/* Tcl interpreter */ +    Tcl_Interp *interp,		/* Tcl interpreter */      int objc,			/* Parameter count */ -    Tcl_Obj* const* objv)	/* Parameter values */ +    Tcl_Obj *const *objv)	/* Parameter values */  { -    static const char *clicksSwitches[] = { +    static const char *const clicksSwitches[] = {  	"-milliseconds", "-microseconds", NULL      };      enum ClicksSwitch { -	CLICKS_MILLIS,   CLICKS_MICROS,   CLICKS_NATIVE +	CLICKS_MILLIS, CLICKS_MICROS, CLICKS_NATIVE      };      int index = CLICKS_NATIVE;      Tcl_Time now; +    Tcl_WideInt clicks = 0;      switch (objc) {      case 1: @@ -1714,28 +1716,25 @@ ClockClicksObjCmd(      switch (index) {      case CLICKS_MILLIS:  	Tcl_GetTime(&now); -	Tcl_SetObjResult(interp, Tcl_NewWideIntObj((Tcl_WideInt) -		now.sec * 1000 + now.usec / 1000)); +	clicks = (Tcl_WideInt) now.sec * 1000 + now.usec / 1000;  	break; -    case CLICKS_NATIVE: { -#ifndef TCL_WIDE_CLICKS -	unsigned long clicks = TclpGetClicks(); +    case CLICKS_NATIVE: +#ifdef TCL_WIDE_CLICKS +	clicks = TclpGetWideClicks();  #else -	Tcl_WideInt clicks = TclpGetWideClicks(); +	clicks = (Tcl_WideInt) TclpGetClicks();  #endif -	Tcl_SetObjResult(interp, Tcl_NewWideIntObj((Tcl_WideInt) clicks));  	break; -    }      case CLICKS_MICROS:  	Tcl_GetTime(&now); -	Tcl_SetObjResult(interp, Tcl_NewWideIntObj( -		((Tcl_WideInt) now.sec * 1000000) + now.usec)); +	clicks = ((Tcl_WideInt) now.sec * 1000000) + now.usec;  	break;      } +    Tcl_SetObjResult(interp, Tcl_NewWideIntObj(clicks));      return TCL_OK;  } - +  /*----------------------------------------------------------------------   *   * ClockMillisecondsObjCmd - @@ -1757,9 +1756,9 @@ ClockClicksObjCmd(  int  ClockMillisecondsObjCmd(      ClientData clientData,	/* Client data is unused */ -    Tcl_Interp* interp,		/* Tcl interpreter */ +    Tcl_Interp *interp,		/* Tcl interpreter */      int objc,			/* Parameter count */ -    Tcl_Obj* const* objv)	/* Parameter values */ +    Tcl_Obj *const *objv)	/* Parameter values */  {      Tcl_Time now; @@ -1768,11 +1767,11 @@ ClockMillisecondsObjCmd(  	return TCL_ERROR;      }      Tcl_GetTime(&now); -    Tcl_SetObjResult(interp, Tcl_NewWideIntObj( (Tcl_WideInt) +    Tcl_SetObjResult(interp, Tcl_NewWideIntObj((Tcl_WideInt)  	    now.sec * 1000 + now.usec / 1000));      return TCL_OK;  } - +  /*----------------------------------------------------------------------   *   * ClockMicrosecondsObjCmd - @@ -1794,9 +1793,9 @@ ClockMillisecondsObjCmd(  int  ClockMicrosecondsObjCmd(      ClientData clientData,	/* Client data is unused */ -    Tcl_Interp* interp,		/* Tcl interpreter */ +    Tcl_Interp *interp,		/* Tcl interpreter */      int objc,			/* Parameter count */ -    Tcl_Obj* const* objv)	/* Parameter values */ +    Tcl_Obj *const *objv)	/* Parameter values */  {      Tcl_Time now; @@ -1809,7 +1808,7 @@ ClockMicrosecondsObjCmd(  	    ((Tcl_WideInt) now.sec * 1000000) + now.usec));      return TCL_OK;  } - +  /*   *-----------------------------------------------------------------------------   * @@ -1818,12 +1817,12 @@ ClockMicrosecondsObjCmd(   *	Parses the arguments for [clock format].   *   * Results: - *	Returns a standard Tcl result, whose value is a four-element - *	list comprising the time format, the locale, and the timezone. + *	Returns a standard Tcl result, whose value is a four-element list + *	comprising the time format, the locale, and the timezone.   *   * This function exists because the loop that parses the [clock format] - * options is a known performance "hot spot", and is implemented in an - * effort to speed that particular code up. + * options is a known performance "hot spot", and is implemented in an effort + * to speed that particular code up.   *   *-----------------------------------------------------------------------------   */ @@ -1831,56 +1830,53 @@ ClockMicrosecondsObjCmd(  static int  ClockParseformatargsObjCmd(      ClientData clientData,	/* Client data containing literal pool */ -    Tcl_Interp* interp,		/* Tcl interpreter */ +    Tcl_Interp *interp,		/* Tcl interpreter */      int objc,			/* Parameter count */ -    Tcl_Obj *const objv[]	/* Parameter vector */ -) { - -    ClockClientData* dataPtr = (ClockClientData*) clientData; -    Tcl_Obj** litPtr = dataPtr->literals; - -    /* Format, locale and timezone */ - -    Tcl_Obj* results[3]; +    Tcl_Obj *const objv[])	/* Parameter vector */ +{ +    ClockClientData *dataPtr = clientData; +    Tcl_Obj **litPtr = dataPtr->literals; +    Tcl_Obj *results[3];	/* Format, locale and timezone */  #define formatObj results[0]  #define localeObj results[1]  #define timezoneObj results[2]      int gmtFlag = 0; - -    /* Command line options expected */ - -    static const char* options[] = { -	"-format",		"-gmt",			"-locale", -	"-timezone",		NULL }; +    static const char *const options[] = { /* Command line options expected */ +	"-format",	"-gmt",		"-locale", +	"-timezone",	NULL };      enum optionInd {  	CLOCK_FORMAT_FORMAT,	CLOCK_FORMAT_GMT,	CLOCK_FORMAT_LOCALE,  	CLOCK_FORMAT_TIMEZONE      }; -    int optionIndex;		/* Index of an option */ -    int saw = 0;		/* Flag == 1 if option was seen already */ -    Tcl_WideInt clockVal;	/* Clock value - just used to parse */ +    int optionIndex;		/* Index of an option. */ +    int saw = 0;		/* Flag == 1 if option was seen already. */ +    Tcl_WideInt clockVal;	/* Clock value - just used to parse. */      int i; -    /* Args consist of a time followed by keyword-value pairs */ +    /* +     * Args consist of a time followed by keyword-value pairs. +     */      if (objc < 2 || (objc % 2) != 0) {  	Tcl_WrongNumArgs(interp, 0, objv, -			 "clock format clockval ?-format string? " -			 "?-gmt boolean? ?-locale LOCALE? ?-timezone ZONE?"); +		"clock format clockval ?-format string? " +		"?-gmt boolean? ?-locale LOCALE? ?-timezone ZONE?");  	Tcl_SetErrorCode(interp, "CLOCK", "wrongNumArgs", NULL);  	return TCL_ERROR;      } -    /* Extract values for the keywords */ +    /* +     * Extract values for the keywords. +     */      formatObj = litPtr[LIT__DEFAULT_FORMAT];      localeObj = litPtr[LIT_C];      timezoneObj = litPtr[LIT__NIL];      for (i = 2; i < objc; i+=2) {  	if (Tcl_GetIndexFromObj(interp, objv[i], options, "switch", 0, -				&optionIndex) != TCL_OK) { +		&optionIndex) != TCL_OK) {  	    Tcl_SetErrorCode(interp, "CLOCK", "badSwitch", -			     Tcl_GetString(objv[i]), NULL); +		    Tcl_GetString(objv[i]), NULL);  	    return TCL_ERROR;  	}  	switch (optionIndex) { @@ -1888,7 +1884,7 @@ ClockParseformatargsObjCmd(  	    formatObj = objv[i+1];  	    break;  	case CLOCK_FORMAT_GMT: -	    if (Tcl_GetBooleanFromObj(interp, objv[i+1], &gmtFlag) != TCL_OK) { +	    if (Tcl_GetBooleanFromObj(interp, objv[i+1], &gmtFlag) != TCL_OK){  		return TCL_ERROR;  	    }  	    break; @@ -1899,16 +1895,18 @@ ClockParseformatargsObjCmd(  	    timezoneObj = objv[i+1];  	    break;  	} -	saw |= (1 << optionIndex); +	saw |= 1 << optionIndex;      } -    /* Check options */ +    /* +     * Check options. +     */      if (Tcl_GetWideIntFromObj(interp, objv[1], &clockVal) != TCL_OK) {  	return TCL_ERROR;      }      if ((saw & (1 << CLOCK_FORMAT_GMT)) -	&& (saw & (1 << CLOCK_FORMAT_TIMEZONE))) { +	    && (saw & (1 << CLOCK_FORMAT_TIMEZONE))) {  	Tcl_SetObjResult(interp, litPtr[LIT_CANNOT_USE_GMT_AND_TIMEZONE]);  	Tcl_SetErrorCode(interp, "CLOCK", "gmtWithTimezone", NULL);  	return TCL_ERROR; @@ -1917,7 +1915,9 @@ ClockParseformatargsObjCmd(  	timezoneObj = litPtr[LIT_GMT];      } -    /* Return options as a list */ +    /* +     * Return options as a list. +     */      Tcl_SetObjResult(interp, Tcl_NewListObj(3, results));      return TCL_OK; @@ -1925,9 +1925,8 @@ ClockParseformatargsObjCmd(  #undef timezoneObj  #undef localeObj  #undef formatObj -  } - +  /*----------------------------------------------------------------------   *   * ClockSecondsObjCmd - @@ -1949,9 +1948,9 @@ ClockParseformatargsObjCmd(  int  ClockSecondsObjCmd(      ClientData clientData,	/* Client data is unused */ -    Tcl_Interp* interp,		/* Tcl interpreter */ +    Tcl_Interp *interp,		/* Tcl interpreter */      int objc,			/* Parameter count */ -    Tcl_Obj* const* objv)	/* Parameter values */ +    Tcl_Obj *const *objv)	/* Parameter values */  {      Tcl_Time now; @@ -1963,7 +1962,7 @@ ClockSecondsObjCmd(      Tcl_SetObjResult(interp, Tcl_NewWideIntObj((Tcl_WideInt) now.sec));      return TCL_OK;  } - +  /*   *----------------------------------------------------------------------   * @@ -1984,9 +1983,9 @@ ClockSecondsObjCmd(  static void  TzsetIfNecessary(void)  { -    static char* tzWas = NULL;	/* Previous value of TZ, protected by +    static char *tzWas = NULL;	/* Previous value of TZ, protected by  				 * clockMutex. */ -    const char* tzIsNow;	/* Current value of TZ */ +    const char *tzIsNow;	/* Current value of TZ */      Tcl_MutexLock(&clockMutex);      tzIsNow = getenv("TZ"); @@ -2004,7 +2003,7 @@ TzsetIfNecessary(void)      }      Tcl_MutexUnlock(&clockMutex);  } - +  /*   *----------------------------------------------------------------------   * @@ -2023,19 +2022,19 @@ static void  ClockDeleteCmdProc(      ClientData clientData)	/* Opaque pointer to the client data */  { -    ClockClientData *data = (ClockClientData*) clientData; +    ClockClientData *data = clientData;      int i; -    --(data->refCount); +    data->refCount--;      if (data->refCount == 0) {  	for (i = 0; i < LIT__END; ++i) {  	    Tcl_DecrRefCount(data->literals[i]);  	} -	ckfree((char*) (data->literals)); -	ckfree((char*) data); +	ckfree(data->literals); +	ckfree(data);      }  } - +  /*   * Local Variables:   * mode: c | 
