source: Daodan/MinGW/include/time.h@ 1131

Last change on this file since 1131 was 1046, checked in by alloc, 8 years ago

Daodan: Added Windows MinGW and build batch file

File size: 19.2 KB
RevLine 
[1046]1/*
2 * time.h
3 *
4 * Type definitions and function declarations relating to date and time.
5 *
6 * $Id: time.h,v c96797f9657b 2016/04/12 14:36:20 keithmarshall $
7 *
8 * Written by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
9 * Copyright (C) 1997-2007, 2011, 2015, 2016, MinGW.org Project.
10 *
11 *
12 * Permission is hereby granted, free of charge, to any person obtaining a
13 * copy of this software and associated documentation files (the "Software"),
14 * to deal in the Software without restriction, including without limitation
15 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 * and/or sell copies of the Software, and to permit persons to whom the
17 * Software is furnished to do so, subject to the following conditions:
18 *
19 * The above copyright notice, this permission notice, and the following
20 * disclaimer shall be included in all copies or substantial portions of
21 * the Software.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OR OTHER
29 * DEALINGS IN THE SOFTWARE.
30 *
31 */
32#if ! defined _TIME_H || defined __need_time_t
33#pragma GCC system_header
34
35/* Irrespective of whether this is normal or selective inclusion of
36 * <time.h>, we ALWAYS require the definition for time_t; get it by
37 * selective inclusion from its primary source, in <sys/types.h>;
38 * note that we must ALWAYS delegate this, when __need_time_t is
39 * defined, even when _TIME_H had been defined previously, to ensure
40 * that __need_time_t is properly reset, and thus cannot compromise
41 * a later inclusion of <sys/types.h>
42 */
43#undef __need_time_h
44#define __need_time_t 1
45#include <sys/types.h>
46
47#ifndef _TIME_H
48/* To support selective partial inclusion, we do not immediately define
49 * the normal _TIME_H guard macro; initially, we also clear all of those
50 * declaraction subset selection macros which are applicable herein.
51 */
52#undef __need_struct_timespec
53#undef __need_wchar_decls
54
55#if defined __WCHAR_H_SOURCED__
56/* This is selective inclusion by <wchar.h>; thus, we do not define the
57 * _TIME_H guard macro, and we select only the minimally required subset
58 * of declarations to be exposed from within <time.h>
59 */
60# define __need_wchar_decls 1
61
62/* Both ISO-C and POSIX stipulate that <wchar.h> shall declare "struct tm"
63 * as an incomplete structure, with its complete declaration to be provided
64 * by <time.h>; provide an incomplete forward declaration, to satisfy this
65 * minimal requirement for selective inclusion by <wchar.h>
66 */
67struct tm;
68
69#else
70#define _TIME_H
71/* This is normal inclusion of <time.h>, in its own right. All our system
72 * headers are required to include <_mingw.h>, but in the case of selective
73 * inclusion, we delegate that responsibility to the including header; when
74 * including <time.h> directly, we must fulfil this requirement now.
75 */
76#include <_mingw.h>
77
78/* Number of clock ticks per second. A clock tick is the unit by which
79 * processor time is measured and is returned by 'clock'.
80 */
81#define CLOCKS_PER_SEC ((clock_t)(1000))
82#define CLK_TCK CLOCKS_PER_SEC
83
84#define __need_struct_timespec 1
85#define __need_wchar_decls 1
86#endif
87
88#ifndef RC_INVOKED
89#if defined __need_struct_timespec && ! __struct_timespec_defined
90/* Structure timespec is mandated by POSIX, for specification of
91 * intervals with the greatest precision supported by the OS kernel.
92 * Although this allows for specification to nanosecond precision, do
93 * not be deluded into any false expectation that such short intervals
94 * can be realized on Windows; on Win9x derivatives, the metronome used
95 * by the process scheduler has a period of ~55 milliseconds, while for
96 * WinNT derivatives, the corresponding period is ~15 milliseconds; thus,
97 * the shortest intervals which can be realistically timed will range
98 * from 0..55 milliseconds on Win9x hosts, and from 0..15 ms on WinNT,
99 * with period values normally distributed around means of ~27.5 ms
100 * and ~7.5 ms, for the two system types respectively.
101 */
102struct timespec
103{ /* Period is sum of tv_sec + tv_nsec; while 32-bits is sufficient
104 * to accommodate tv_nsec, we use 64-bit __time64_t for tv_sec, to
105 * ensure that we have a sufficiently large field to accommodate
106 * Microsoft's ambiguous __time32_t vs. __time64_t representation
107 * of time_t; we may resolve this ambiguity locally, by casting a
108 * pointer to a struct timespec to point to an identically sized
109 * struct __mingw32_timespec, which is defined below.
110 */
111 __time64_t tv_sec; /* seconds; accept 32 or 64 bits */
112 __int32 tv_nsec; /* nanoseconds */
113};
114
115# ifdef _MINGW32_SOURCE_EXTENDED
116struct __mingw32_expanded_timespec
117{
118 /* Equivalent of struct timespec, with disambiguation for the
119 * 32-bit vs. 64-bit tv_sec field declaration. Period is the
120 * sum of tv_sec + tv_nsec; we use explicitly sized types to
121 * avoid 32-bit vs. 64-bit time_t ambiguity...
122 */
123 union
124 { /* ...within this anonymous union, allowing tv_sec to accommodate
125 * seconds expressed in either of Microsoft's (ambiguously sized)
126 * time_t representations.
127 */
128 __time64_t __tv64_sec; /* unambiguously 64 bits */
129 __time32_t __tv32_sec; /* unambiguously 32 bits */
130 time_t tv_sec; /* ambiguously 32 or 64 bits */
131 };
132 __int32 tv_nsec; /* nanoseconds */
133};
134# endif /* _MINGW32_SOURCE_EXTENDED */
135
136# define __struct_timespec_defined 1
137#endif
138
139#ifdef _TIME_H
140#ifdef _MINGW32_SOURCE_EXTENDED
141
142_BEGIN_C_DECLS
143
144__CRT_ALIAS __LIBIMPL__(( FUNCTION = mingw_timespec ))
145/* This non-ANSI convenience function facilitates access to entities
146 * defined as struct timespec, while exposing the broken down form of
147 * the tv_sec field, as declared within struct __mingw32_timespec. It
148 * is exposed only when _MINGW32_SOURCE_EXTENDED is defined, which is
149 * normally implicitly the case, except when in __STRICT_ANSI__ mode
150 * unless the user defines it explicitly.
151 */
152struct __mingw32_expanded_timespec *mingw_timespec( struct timespec *__tv )
153{ return (struct __mingw32_expanded_timespec *)(__tv); }
154
155_END_C_DECLS
156
157#endif /* _MINGW32_SOURCE_EXTENDED */
158
159/* <time.h> is also required to duplicate the following type definitions,
160 * which are nominally defined in <stddef.h>
161 */
162#define __need_NULL
163#define __need_wchar_t
164#define __need_size_t
165#include <stddef.h>
166
167/* A type for measuring processor time in clock ticks; (no need to
168 * guard this, since it isn't defined elsewhere).
169 */
170typedef long clock_t;
171
172struct tm
173{ /* A structure for storing the attributes of a broken-down time; (once
174 * again, it isn't defined elsewhere, so no guard is necessary). Note
175 * that we are within the scope of <time.h> itself, so we must provide
176 * the complete structure declaration here.
177 */
178 int tm_sec; /* Seconds: 0-60 (to accommodate leap seconds) */
179 int tm_min; /* Minutes: 0-59 */
180 int tm_hour; /* Hours since midnight: 0-23 */
181 int tm_mday; /* Day of the month: 1-31 */
182 int tm_mon; /* Months *since* January: 0-11 */
183 int tm_year; /* Years since 1900 */
184 int tm_wday; /* Days since Sunday (0-6) */
185 int tm_yday; /* Days since Jan. 1: 0-365 */
186 int tm_isdst; /* +1=Daylight Savings Time, 0=No DST, -1=unknown */
187};
188
189_BEGIN_C_DECLS
190
191_CRTIMP __cdecl __MINGW_NOTHROW clock_t clock (void);
192
193#if __MSVCRT_VERSION__ < __MSVCR80_DLL
194 /* Although specified as ISO-C functions, Microsoft withdrew direct
195 * support for these, with their ISO-C names, from MSVCR80.DLL onwards,
196 * preferring to map them via header file macros, to alternatively named
197 * DLL functions with ambiguous time_t representations; they remain in
198 * MSVCRT.DLL, however, with their original ISO-C names, and time_t
199 * unambiguously represented as a 32-bit data type.
200 */
201_CRTIMP __cdecl __MINGW_NOTHROW time_t time (time_t *);
202_CRTIMP __cdecl __MINGW_NOTHROW double difftime (time_t, time_t);
203_CRTIMP __cdecl __MINGW_NOTHROW time_t mktime (struct tm *);
204#endif
205
206/* These functions write to and return pointers to static buffers that may
207 * be overwritten by other function calls. Yikes!
208 *
209 * NOTE: localtime, and perhaps the others of the four functions grouped
210 * below may return NULL if their argument is not 'acceptable'. Also note
211 * that calling asctime with a NULL pointer will produce an Invalid Page
212 * Fault and crap out your program. Guess how I know. Hint: stat called on
213 * a directory gives 'invalid' times in st_atime etc...
214 */
215_CRTIMP __cdecl __MINGW_NOTHROW char *asctime (const struct tm *);
216
217#if __MSVCRT_VERSION__ < __MSVCR80_DLL
218 /* Once again, these have been withdrawn from MSVCR80.DLL, (and later),
219 * but remain in MSVCRT.DLL, with unambiguously 32-bit time_t.
220 */
221_CRTIMP __cdecl __MINGW_NOTHROW char *ctime (const time_t *);
222_CRTIMP __cdecl __MINGW_NOTHROW struct tm *gmtime (const time_t *);
223_CRTIMP __cdecl __MINGW_NOTHROW struct tm *localtime (const time_t *);
224#endif
225
226_CRTIMP __cdecl __MINGW_NOTHROW
227size_t strftime (char *, size_t, const char *, const struct tm *);
228
229#ifndef __STRICT_ANSI__
230extern _CRTIMP __cdecl __MINGW_NOTHROW void _tzset (void);
231
232#ifndef _NO_OLDNAMES
233extern _CRTIMP __cdecl __MINGW_NOTHROW void tzset (void);
234#endif
235
236_CRTIMP __cdecl __MINGW_NOTHROW char *_strdate (char *);
237_CRTIMP __cdecl __MINGW_NOTHROW char *_strtime (char *);
238
239#if __MSVCRT_VERSION__ >= __MSVCR61_DLL || _WIN32_WINNT >= _WIN32_WINNT_WIN2K
240/* These 64-bit time_t variant functions first became available in
241 * MSVCR61.DLL, and its descendants; they were subsequently included
242 * in MSVCRT.DLL, from its Win2K release onwards.
243 */
244_CRTIMP __cdecl __MINGW_NOTHROW __time64_t _time64( __time64_t *);
245_CRTIMP __cdecl __MINGW_NOTHROW __time64_t _mktime64 (struct tm *);
246_CRTIMP __cdecl __MINGW_NOTHROW char *_ctime64 (const __time64_t *);
247_CRTIMP __cdecl __MINGW_NOTHROW struct tm *_gmtime64 (const __time64_t *);
248_CRTIMP __cdecl __MINGW_NOTHROW struct tm *_localtime64 (const __time64_t *);
249
250#endif /* __MSVCR61_DLL, _WIN32_WINNT_WIN2K, and descendants. */
251
252#if __MSVCRT_VERSION__ >= __MSVCR80_DLL || _WIN32_WINNT >= _WIN32_WINNT_VISTA
253 /* The following were introduced in MSVCR80.DLL, and they subsequently
254 * appeared in MSVCRT.DLL, from Windows-Vista onwards.
255 */
256_CRTIMP __cdecl __MINGW_NOTHROW char *_ctime32 (const __time32_t *);
257_CRTIMP __cdecl __MINGW_NOTHROW double _difftime32 (__time32_t, __time32_t);
258_CRTIMP __cdecl __MINGW_NOTHROW double _difftime64 (__time64_t, __time64_t);
259_CRTIMP __cdecl __MINGW_NOTHROW struct tm *_gmtime32 (const __time32_t *);
260_CRTIMP __cdecl __MINGW_NOTHROW struct tm *_localtime32 (const __time32_t *);
261_CRTIMP __cdecl __MINGW_NOTHROW __time32_t _mktime32 (struct tm *);
262_CRTIMP __cdecl __MINGW_NOTHROW __time32_t _mkgmtime32 (struct tm *);
263_CRTIMP __cdecl __MINGW_NOTHROW __time64_t _mkgmtime64 (struct tm *);
264_CRTIMP __cdecl __MINGW_NOTHROW __time32_t _time32 (__time32_t *);
265
266# if __MSVCRT_VERSION__ >= __MSVCR80_DLL && defined _USE_32BIT_TIME_T
267 /* Users of MSVCR80.DLL and later, (but not users of MSVCRT.DLL, even
268 * for _WIN32_WINNT_VISTA and later), must contend with the omission of
269 * the following functions from their DLL of choice, thus requiring these
270 * brain damaged mappings, in terms of an ambiguously defined 'time_t';
271 * thus, when 'time_t' is declared to be equivalent to '__time32_t':
272 */
273__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t time (time_t *__v)
274 { return _time32 (__v); }
275
276__CRT_ALIAS __cdecl __MINGW_NOTHROW double difftime (time_t __v1, time_t __v2)
277 { return _difftime32 (__v1, __v2); }
278
279__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t mktime (struct tm *__v)
280 { return _mktime32 (__v); }
281
282__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t _mkgmtime (struct tm *__v)
283 { return _mkgmtime32 (__v); }
284
285__CRT_ALIAS __cdecl __MINGW_NOTHROW char *ctime (const time_t *__v)
286 { return _ctime32 (__v); }
287
288__CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *gmtime (const time_t *__v)
289 { return _gmtime32 (__v); }
290
291__CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *localtime (const time_t *__v)
292 { return _localtime32 (__v); }
293
294# elif __MSVCRT_VERSION__ >= __MSVCR80_DLL
295 /* Correspondingly, for users of MSVCR80.DLL and later only, when there
296 * is no explicit declaration to direct the specification of 'time_t', and
297 * thus 'time_t' is assumed to be equivalent to '__time64_t':
298 */
299__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t time (time_t *__v)
300 { return _time64 (__v); }
301
302__CRT_ALIAS __cdecl __MINGW_NOTHROW double difftime (time_t __v1, time_t __v2)
303 { return _difftime64 (__v1, __v2); }
304
305__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t mktime (struct tm *__v)
306 { return _mktime64 (__v); }
307
308__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t _mkgmtime (struct tm *__v)
309 { return _mkgmtime64 (__v); }
310
311__CRT_ALIAS __cdecl __MINGW_NOTHROW char *ctime (const time_t *__v)
312 { return _ctime64 (__v); }
313
314__CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *gmtime (const time_t *__v)
315 { return _gmtime64 (__v); }
316
317__CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *localtime (const time_t *__v)
318 { return _localtime64 (__v); }
319
320# endif /* _USE_32BIT_TIME_T brain damage */
321#endif /* >=__MSVCR80.DLL || >=_WIN32_WINNT_VISTA */
322
323/* _daylight: non zero if daylight savings time is used.
324 * _timezone: difference in seconds between GMT and local time.
325 * _tzname: standard/daylight savings time zone names (an array with two
326 * elements).
327 */
328#ifdef __MSVCRT__
329/* These are for compatibility with pre-VC 5.0 supplied MSVCRT.DLL
330 */
331extern _CRTIMP __cdecl __MINGW_NOTHROW int *__p__daylight (void);
332extern _CRTIMP __cdecl __MINGW_NOTHROW long *__p__timezone (void);
333extern _CRTIMP __cdecl __MINGW_NOTHROW char **__p__tzname (void);
334
335__MINGW_IMPORT int _daylight;
336__MINGW_IMPORT long _timezone;
337__MINGW_IMPORT char *_tzname[2];
338
339#else /* !__MSVCRT__ (i.e. using CRTDLL.DLL) */
340#ifndef __DECLSPEC_SUPPORTED
341
342extern int *_imp___daylight_dll;
343extern long *_imp___timezone_dll;
344extern char **_imp___tzname;
345
346#define _daylight (*_imp___daylight_dll)
347#define _timezone (*_imp___timezone_dll)
348#define _tzname (*_imp___tzname)
349
350#else /* __DECLSPEC_SUPPORTED */
351
352__MINGW_IMPORT int _daylight_dll;
353__MINGW_IMPORT long _timezone_dll;
354__MINGW_IMPORT char *_tzname[2];
355
356#define _daylight _daylight_dll
357#define _timezone _timezone_dll
358
359#endif /* __DECLSPEC_SUPPORTED */
360#endif /* ! __MSVCRT__ */
361#endif /* ! __STRICT_ANSI__ */
362
363#ifndef _NO_OLDNAMES
364#ifdef __MSVCRT__
365
366/* These go in the oldnames import library for MSVCRT.
367 */
368__MINGW_IMPORT int daylight;
369__MINGW_IMPORT long timezone;
370__MINGW_IMPORT char *tzname[2];
371
372#else /* ! __MSVCRT__ */
373/* CRTDLL is royally messed up when it comes to these macros.
374 * TODO: import and alias these via oldnames import library instead
375 * of macros.
376 */
377#define daylight _daylight
378
379/* NOTE: timezone not defined as a macro because it would conflict with
380 * struct timezone in sys/time.h. Also, tzname used to a be macro, but
381 * now it's in moldname.
382 */
383__MINGW_IMPORT char *tzname[2];
384
385#endif /* ! __MSVCRT__ */
386#endif /* ! _NO_OLDNAMES */
387
388#if _POSIX_C_SOURCE
389/* The nanosleep() function provides the most general purpose API for
390 * process/thread suspension; it provides for specification of periods
391 * ranging from ~7.5 ms mean, (on WinNT derivatives; ~27.5 ms on Win9x),
392 * extending up to ~136 years, (effectively eternity).
393 */
394__cdecl __MINGW_NOTHROW
395int nanosleep( const struct timespec *, struct timespec * );
396
397#ifndef __NO_INLINE__
398/* We may conveniently provide an in-line implementation here,
399 * in terms of the __mingw_sleep() helper function.
400 */
401__cdecl __MINGW_NOTHROW
402int __mingw_sleep( unsigned long, unsigned long );
403
404__CRT_INLINE __LIBIMPL__(( FUNCTION = nanosleep ))
405int nanosleep( const struct timespec *period, struct timespec *residual )
406{
407 if( residual != (void *)(0) )
408 residual->tv_sec = (__time64_t)(residual->tv_nsec = 0);
409 return __mingw_sleep((unsigned)(period->tv_sec), (period->tv_sec < 0LL)
410 ? (unsigned)(-1) : (unsigned)(period->tv_nsec));
411}
412#endif /* !__NO_INLINE__ */
413#endif /* _POSIX_C_SOURCE */
414
415_END_C_DECLS
416
417#endif /* _TIME_H included in its own right */
418
419#if __need_wchar_decls && ! (defined _TIME_H && defined _WCHAR_H)
420/* Wide character time function prototypes. These are nominally declared
421 * both here, in <time.h>, and also in <wchar.h>; we declare them here, and
422 * make them available for selective inclusion by <wchar.h>, but such that
423 * the declarations, and in particular any in-line implementation of the
424 * _wctime() function, are visible only on the first time parse, when
425 * one of either _TIME_H, or _WCHAR_H, but not both, is defined.
426 */
427_BEGIN_C_DECLS
428
429#if defined __MSVCRT__ && ! defined __STRICT_ANSI__
430_CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wasctime (const struct tm *);
431_CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wstrdate (wchar_t *);
432_CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wstrtime (wchar_t *);
433
434#if __MSVCRT_VERSION__ >= __MSVCR61_DLL || _WIN32_WINNT >= _WIN32_WINNT_WIN2K
435/* A __time64_t specific variant of _wctime(), identified as _wctime64(),
436 * first appeared in the non-free MSVC specific MSVCR61.DLL, and was added
437 * to the freely available platform MSVCRT.DLL from Win2K onwards...
438 */
439_CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wctime64 (const __time64_t *);
440#endif
441#if __MSVCRT_VERSION__ >= __MSVCR80_DLL || _WIN32_WINNT >= _WIN32_WINNT_VISTA
442/* ...whereas its __time32_t specific counterpart, _wctime32(), did not
443 * make an appearance until MSVCR80.DLL, and was not added to MSVCRT.DLL
444 * until the release of Vista.
445 */
446_CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wctime32 (const __time32_t *);
447#endif
448#if __MSVCRT_VERSION__ < __MSVCR80_DLL
449/* Present in all versions of MSVCRT.DLL, but withdrawn from non-free
450 * MSVC specific releases from MSVCR80.DLL onwards; in all versions of
451 * MSVCRT.DLL, _wctime() accepts a 32-bit time_t argument pointer.
452 */
453_CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wctime (const time_t *);
454
455#else /* __MSVCRT_VERSION__ >= __MSVCR80_DLL */
456/* For users of the non-free MSVC libraries, we must deal with both the
457 * absence of _wctime(), and with Microsoft's attendant _USE_32BIT_TIME_T
458 * brain damage, as we map an inline replacement...
459 */
460__CRT_ALIAS __cdecl __MINGW_NOTHROW wchar_t *_wctime (const time_t *__v)
461{
462 /* ...in terms of an appropriately selected time_t size specific
463 * alternative function, which should be available...
464 */
465# ifdef _USE_32BIT_TIME_T
466 /* ...i.e. the __time32_t specific _wctime32(), when the user has
467 * enabled this choice; (the only sane choice, if compatibility with
468 * MSVCRT.DLL is desired)...
469 */
470 return _wctime32 (__v);
471
472# else /* !_USE_32BIT_TIME_T */
473 /* ...or otherwise, the __time64_t specific _wctime64(), (in which
474 * case, compatibility with MSVCRT.DLL must be sacrificed).
475 */
476 return _wctime64 (__v);
477# endif /* !_USE_32BIT_TIME_T */
478}
479#endif /* __MSVCRT_VERSION__ >= __MSVCR80_DLL */
480#endif /* __MSVCRT__ && !__STRICT_ANSI__ */
481
482_CRTIMP __cdecl __MINGW_NOTHROW
483size_t wcsftime (wchar_t *, size_t, const wchar_t *, const struct tm *);
484
485_END_C_DECLS
486
487#endif /* ! (defined _TIME_H && defined _WCHAR_H) */
488
489/* We're done with all <time.h> specific content selectors; clear them.
490 */
491#undef __need_time_t
492#undef __need_struct_timespec
493#undef __need_wchar_decls
494
495#endif /* ! RC_INVOKED */
496#endif /* !_TIME_H after __need_time_t processing */
497#endif /* !_TIME_H: $RCSfile: time.h,v $: end of file */
Note: See TracBrowser for help on using the repository browser.