- makefile: use the native headers, don't bother with our hopelessly broken ones - tickcount.c: also accept arbitrary tick counts as arguments or from standard input (initially conceived to convert the result of subtracting two Date objects in Javascript - which conveniently happens to be a count of milliseconds - into a human-readable format. Useful to write a batch file that calculates the exact difference between two dates). Also use typedef aliases for __int64 that won't conflict with standard C typedefs
(I had a craving for C code, too much Java for school was melting my brain. Thanks god for good ol' tickcount) Modified: trunk/reactos/apps/utils/tickcount/makefile Modified: trunk/reactos/apps/utils/tickcount/tickcount.c _____
Modified: trunk/reactos/apps/utils/tickcount/makefile --- trunk/reactos/apps/utils/tickcount/makefile 2005-01-05 19:06:05 UTC (rev 12830) +++ trunk/reactos/apps/utils/tickcount/makefile 2005-01-05 19:09:38 UTC (rev 12831) @@ -12,7 +12,7 @@
TARGET_OBJECTS = tickcount.o
-TARGET_CFLAGS = -Wall -Werror +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API
include $(PATH_TO_TOP)/rules.mak
_____
Modified: trunk/reactos/apps/utils/tickcount/tickcount.c --- trunk/reactos/apps/utils/tickcount/tickcount.c 2005-01-05 19:06:05 UTC (rev 12830) +++ trunk/reactos/apps/utils/tickcount/tickcount.c 2005-01-05 19:09:38 UTC (rev 12831) @@ -1,30 +1,32 @@
-/* $Id: tickcount.c,v 1.2 2003/07/06 23:04:18 hyperion Exp $ +/* $Id$ */ /* - tickcount -- Display the kernel tick count in human-readable format + tickcount -- Display the kernel tick count (or any tick count passed as an + argument or as input) in human-readable format
This is public domain software */
#include <assert.h> #include <stdio.h> +#include <stdlib.h> #include <tchar.h> #include <windows.h>
-typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; +typedef __int64 int64_; +typedef unsigned __int64 uint64_;
-#define TICKS_YEAR (TICKS_DAY * ((uint64_t)365)) -#define TICKS_MONTH (TICKS_DAY * ((uint64_t)30)) -#define TICKS_WEEK (TICKS_DAY * ((uint64_t)7)) -#define TICKS_DAY (TICKS_HOUR * ((uint64_t)24)) -#define TICKS_HOUR (TICKS_MINUTE * ((uint64_t)60)) -#define TICKS_MINUTE (TICKS_SECOND * ((uint64_t)60)) -#define TICKS_SECOND ((uint64_t)1000) +#define TICKS_YEAR (TICKS_DAY * ((uint64_)365)) +#define TICKS_MONTH (TICKS_DAY * ((uint64_)30)) +#define TICKS_WEEK (TICKS_DAY * ((uint64_)7)) +#define TICKS_DAY (TICKS_HOUR * ((uint64_)24)) +#define TICKS_HOUR (TICKS_MINUTE * ((uint64_)60)) +#define TICKS_MINUTE (TICKS_SECOND * ((uint64_)60)) +#define TICKS_SECOND ((uint64_)1000)
#define SLICES_COUNT (sizeof(ticks_per_slice) / sizeof(ticks_per_slice[0]))
-uint64_t ticks_per_slice[] = +uint64_ ticks_per_slice[] = { TICKS_YEAR, TICKS_MONTH, @@ -36,7 +38,7 @@ 1 };
-_TCHAR * slice_names_singular[] = +_TCHAR * slice_names_singular[SLICES_COUNT] = { _T("year"), _T("month"), @@ -48,7 +50,7 @@ _T("millisecond") };
-_TCHAR * slice_names_plural[] = +_TCHAR * slice_names_plural[SLICES_COUNT] = { _T("years"), _T("months"), @@ -62,16 +64,16 @@
void print_uptime ( - uint64_t tickcount, - uint64_t prevsliceval, + uint64_ tickcount, + uint64_ prevsliceval, _TCHAR * prevsliceunit, int curslice ) { - uint64_t tick_cur = tickcount / ticks_per_slice[curslice]; - uint64_t tick_residual = tickcount % ticks_per_slice[curslice]; + uint64_ tick_cur = tickcount / ticks_per_slice[curslice]; + uint64_ tick_residual = tickcount % ticks_per_slice[curslice];
- assert(tick_cur <= (~((uint64_t)0))); + assert(tick_cur <= (~((uint64_)0)));
if(tick_residual == 0) { @@ -134,9 +136,56 @@ } }
-int _tmain() +int parse_print(const _TCHAR * str) { - print_uptime((uint64_t)GetTickCount(), 0, NULL, 0); + int64_ tickcount; + + tickcount = _ttoi64(str); + + if(tickcount < 0) + tickcount = - tickcount; + else if(tickcount == 0) + return 1; + + print_uptime(tickcount, 0, NULL, 0); _puttc(_T('\n'), stdout); + return 0; } + +int _tmain(int argc, _TCHAR * argv[]) +{ + int r; + + if(argc <= 1) + { + print_uptime((uint64_)GetTickCount(), 0, NULL, 0); + _puttc(_T('\n'), stdout); + } + else if(argc == 2 && argv[1][0] == _T('-') && argv[1][1] == 0) + { + while(!feof(stdin)) + { + _TCHAR buf[23]; + _TCHAR * str; + + str = _fgetts(buf, 22, stdin); + + if(str == NULL) + return 0; + + if((r = parse_print(str)) != 0) + return r; + } + } + else + { + int i; + + for(i = 1; i < argc; ++ i) + if((r = parse_print(argv[i])) != 0) + return r; + } + + return 0; +}