Main MRPT website > C++ reference for MRPT 1.4.0
pstdint.h
Go to the documentation of this file.
1/* +---------------------------------------------------------------------------+
2 | Mobile Robot Programming Toolkit (MRPT) |
3 | http://www.mrpt.org/ |
4 | |
5 | Copyright (c) 2005-2016, Individual contributors, see AUTHORS file |
6 | See: http://www.mrpt.org/Authors - All rights reserved. |
7 | Released under BSD License. See details in http://www.mrpt.org/License |
8 +---------------------------------------------------------------------------+ */
9
10#ifndef MRPT_PSTDINT_H
11#define MRPT_PSTDINT_H
12
13#include <stddef.h>
14#include <limits.h>
15#include <signal.h>
16
17/*
18 * For gcc with _STDINT_H, fill in the PRINTF_INT*_MODIFIER macros, and
19 * do nothing else. On the Mac OS X version of gcc this is _STDINT_H_.
20 */
21
22//#if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) )) && !defined (_PSTDINT_H_INCLUDED)
23#if (\
24 (defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L)\
25 || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250))\
26 || defined(__GNUC__)\
27 ) && !defined (_PSTDINT_H_INCLUDED)
28
29#include <stdint.h>
30#define _PSTDINT_H_INCLUDED
31# ifndef PRINTF_INT64_MODIFIER
32# define PRINTF_INT64_MODIFIER "ll"
33# endif
34# ifndef PRINTF_INT32_MODIFIER
35# define PRINTF_INT32_MODIFIER "l"
36# endif
37# ifndef PRINTF_INT16_MODIFIER
38# define PRINTF_INT16_MODIFIER "h"
39# endif
40# ifndef PRINTF_INTMAX_MODIFIER
41# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER
42# endif
43# ifndef PRINTF_INT64_HEX_WIDTH
44# define PRINTF_INT64_HEX_WIDTH "16"
45# endif
46# ifndef PRINTF_INT32_HEX_WIDTH
47# define PRINTF_INT32_HEX_WIDTH "8"
48# endif
49# ifndef PRINTF_INT16_HEX_WIDTH
50# define PRINTF_INT16_HEX_WIDTH "4"
51# endif
52# ifndef PRINTF_INT8_HEX_WIDTH
53# define PRINTF_INT8_HEX_WIDTH "2"
54# endif
55# ifndef PRINTF_INT64_DEC_WIDTH
56# define PRINTF_INT64_DEC_WIDTH "20"
57# endif
58# ifndef PRINTF_INT32_DEC_WIDTH
59# define PRINTF_INT32_DEC_WIDTH "10"
60# endif
61# ifndef PRINTF_INT16_DEC_WIDTH
62# define PRINTF_INT16_DEC_WIDTH "5"
63# endif
64# ifndef PRINTF_INT8_DEC_WIDTH
65# define PRINTF_INT8_DEC_WIDTH "3"
66# endif
67# ifndef PRINTF_INTMAX_HEX_WIDTH
68# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH
69# endif
70# ifndef PRINTF_INTMAX_DEC_WIDTH
71# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH
72# endif
73
74/*
75 * Something really weird is going on with Open Watcom. Just pull some of
76 * these duplicated definitions from Open Watcom's stdint.h file for now.
77 */
78
79# if defined (__WATCOMC__) && __WATCOMC__ >= 1250
80# if !defined (INT64_C)
81# define INT64_C(x) (x + (INT64_MAX - INT64_MAX))
82# endif
83# if !defined (UINT64_C)
84# define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX))
85# endif
86# if !defined (INT32_C)
87# define INT32_C(x) (x + (INT32_MAX - INT32_MAX))
88# endif
89# if !defined (UINT32_C)
90# define UINT32_C(x) (x + (UINT32_MAX - UINT32_MAX))
91# endif
92# if !defined (INT16_C)
93# define INT16_C(x) (x)
94# endif
95# if !defined (UINT16_C)
96# define UINT16_C(x) (x)
97# endif
98# if !defined (INT8_C)
99# define INT8_C(x) (x)
100# endif
101# if !defined (UINT8_C)
102# define UINT8_C(x) (x)
103# endif
104# if !defined (UINT64_MAX)
105# define UINT64_MAX 18446744073709551615ULL
106# endif
107# if !defined (INT64_MAX)
108# define INT64_MAX 9223372036854775807LL
109# endif
110# if !defined (UINT32_MAX)
111# define UINT32_MAX 4294967295UL
112# endif
113# if !defined (INT32_MAX)
114# define INT32_MAX 2147483647L
115# endif
116# if !defined (INTMAX_MAX)
117# define INTMAX_MAX INT64_MAX
118# endif
119# if !defined (INTMAX_MIN)
120# define INTMAX_MIN INT64_MIN
121# endif
122# endif
123#endif
124
125#ifndef _PSTDINT_H_INCLUDED
126#define _PSTDINT_H_INCLUDED
127
128#ifndef SIZE_MAX
129# define SIZE_MAX (~(size_t)0)
130#endif
131
132/*
133 * Deduce the type assignments from limits.h under the assumption that
134 * integer sizes in bits are powers of 2, and follow the ANSI
135 * definitions.
136 */
137
138#ifndef UINT8_MAX
139# define UINT8_MAX 0xff
140#endif
141#ifndef uint8_t
142# if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S)
143 typedef unsigned char uint8_t;
144# define UINT8_C(v) ((uint8_t) v)
145# else
146# error "Platform not supported"
147# endif
148#endif
149
150#ifndef INT8_MAX
151# define INT8_MAX 0x7f
152#endif
153#ifndef INT8_MIN
154# define INT8_MIN INT8_C(0x80)
155#endif
156#ifndef int8_t
157# if (SCHAR_MAX == INT8_MAX) || defined (S_SPLINT_S)
158 typedef signed char int8_t;
159# define INT8_C(v) ((int8_t) v)
160# else
161# error "Platform not supported"
162# endif
163#endif
164
165#ifndef UINT16_MAX
166# define UINT16_MAX 0xffff
167#endif
168#ifndef uint16_t
169#if (UINT_MAX == UINT16_MAX) || defined (S_SPLINT_S)
170 typedef unsigned int uint16_t;
171# ifndef PRINTF_INT16_MODIFIER
172# define PRINTF_INT16_MODIFIER ""
173# endif
174# define UINT16_C(v) ((uint16_t) (v))
175#elif (USHRT_MAX == UINT16_MAX)
176 typedef unsigned short uint16_t;
177# define UINT16_C(v) ((uint16_t) (v))
178# ifndef PRINTF_INT16_MODIFIER
179# define PRINTF_INT16_MODIFIER "h"
180# endif
181#else
182#error "Platform not supported"
183#endif
184#endif
185
186#ifndef INT16_MAX
187# define INT16_MAX 0x7fff
188#endif
189#ifndef INT16_MIN
190# define INT16_MIN INT16_C(0x8000)
191#endif
192#ifndef int16_t
193#if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S)
194 typedef signed int int16_t;
195# define INT16_C(v) ((int16_t) (v))
196# ifndef PRINTF_INT16_MODIFIER
197# define PRINTF_INT16_MODIFIER ""
198# endif
199#elif (SHRT_MAX == INT16_MAX)
200 typedef signed short int16_t;
201# define INT16_C(v) ((int16_t) (v))
202# ifndef PRINTF_INT16_MODIFIER
203# define PRINTF_INT16_MODIFIER "h"
204# endif
205#else
206#error "Platform not supported"
207#endif
208#endif
209
210#ifndef UINT32_MAX
211# define UINT32_MAX (0xffffffffUL)
212#endif
213#ifndef uint32_t
214#if (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S)
215# ifndef OPENCV_FLANN_DIST_H_ // An ugly solution to a collision of cvflann for MSC
216 typedef unsigned long uint32_t;
217# endif
218# define UINT32_C(v) v ## UL
219# ifndef PRINTF_INT32_MODIFIER
220# define PRINTF_INT32_MODIFIER "l"
221# endif
222#elif (UINT_MAX == UINT32_MAX)
223 typedef unsigned int uint32_t;
224# ifndef PRINTF_INT32_MODIFIER
225# define PRINTF_INT32_MODIFIER ""
226# endif
227# define UINT32_C(v) v ## U
228#elif (USHRT_MAX == UINT32_MAX)
229 typedef unsigned short uint32_t;
230# define UINT32_C(v) ((unsigned short) (v))
231# ifndef PRINTF_INT32_MODIFIER
232# define PRINTF_INT32_MODIFIER ""
233# endif
234#else
235#error "Platform not supported"
236#endif
237#endif
238
239#ifndef INT32_MAX
240# define INT32_MAX (0x7fffffffL)
241#endif
242#ifndef INT32_MIN
243# define INT32_MIN INT32_C(0x80000000)
244#endif
245#ifndef int32_t
246#if (LONG_MAX == INT32_MAX) || defined (S_SPLINT_S)
247 typedef signed long int32_t;
248# define INT32_C(v) v ## L
249# ifndef PRINTF_INT32_MODIFIER
250# define PRINTF_INT32_MODIFIER "l"
251# endif
252#elif (INT_MAX == INT32_MAX)
253 typedef signed int int32_t;
254# define INT32_C(v) v
255# ifndef PRINTF_INT32_MODIFIER
256# define PRINTF_INT32_MODIFIER ""
257# endif
258#elif (SHRT_MAX == INT32_MAX)
259 typedef signed short int32_t;
260# define INT32_C(v) ((short) (v))
261# ifndef PRINTF_INT32_MODIFIER
262# define PRINTF_INT32_MODIFIER ""
263# endif
264#else
265#error "Platform not supported"
266#endif
267#endif
268
269/*
270 * The macro stdint_int64_defined is temporarily used to record
271 * whether or not 64 integer support is available. It must be
272 * defined for any 64 integer extensions for new platforms that are
273 * added.
274 */
275
276#undef stdint_int64_defined
277#if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S)
278# if (__STDC__ && __STDC_VERSION >= 199901L) || defined (S_SPLINT_S)
279# define stdint_int64_defined
280 typedef long long int64_t;
281 typedef unsigned long long uint64_t;
282# define UINT64_C(v) v ## ULL
283# define INT64_C(v) v ## LL
284# ifndef PRINTF_INT64_MODIFIER
285# define PRINTF_INT64_MODIFIER "ll"
286# endif
287# endif
288#endif
289
290#if !defined (stdint_int64_defined)
291# if defined(__GNUC__)
292# define stdint_int64_defined
293 __extension__ typedef long long int64_t;
294 __extension__ typedef unsigned long long uint64_t;
295# define UINT64_C(v) v ## ULL
296# define INT64_C(v) v ## LL
297# ifndef PRINTF_INT64_MODIFIER
298# define PRINTF_INT64_MODIFIER "ll"
299# endif
300# elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S)
301# define stdint_int64_defined
302 typedef long long int64_t;
303 typedef unsigned long long uint64_t;
304# define UINT64_C(v) v ## ULL
305# define INT64_C(v) v ## LL
306# ifndef PRINTF_INT64_MODIFIER
307# define PRINTF_INT64_MODIFIER "ll"
308# endif
309# elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC)
310# define stdint_int64_defined
311 typedef __int64 int64_t;
312 typedef unsigned __int64 uint64_t;
313# define UINT64_C(v) v ## UI64
314# define INT64_C(v) v ## I64
315# ifndef PRINTF_INT64_MODIFIER
316# define PRINTF_INT64_MODIFIER "I64"
317# endif
318# endif
319#endif
320
321#if !defined (LONG_LONG_MAX) && defined (INT64_C)
322# define LONG_LONG_MAX INT64_C (9223372036854775807)
323#endif
324#ifndef ULONG_LONG_MAX
325# define ULONG_LONG_MAX UINT64_C (18446744073709551615)
326#endif
327
328#if !defined (INT64_MAX) && defined (INT64_C)
329# define INT64_MAX INT64_C (9223372036854775807)
330#endif
331#if !defined (INT64_MIN) && defined (INT64_C)
332# define INT64_MIN INT64_C (-9223372036854775808)
333#endif
334#if !defined (UINT64_MAX) && defined (INT64_C)
335# define UINT64_MAX UINT64_C (18446744073709551615)
336#endif
337
338/*
339 * Width of hexadecimal for number field.
340 */
341
342#ifndef PRINTF_INT64_HEX_WIDTH
343# define PRINTF_INT64_HEX_WIDTH "16"
344#endif
345#ifndef PRINTF_INT32_HEX_WIDTH
346# define PRINTF_INT32_HEX_WIDTH "8"
347#endif
348#ifndef PRINTF_INT16_HEX_WIDTH
349# define PRINTF_INT16_HEX_WIDTH "4"
350#endif
351#ifndef PRINTF_INT8_HEX_WIDTH
352# define PRINTF_INT8_HEX_WIDTH "2"
353#endif
354
355#ifndef PRINTF_INT64_DEC_WIDTH
356# define PRINTF_INT64_DEC_WIDTH "20"
357#endif
358#ifndef PRINTF_INT32_DEC_WIDTH
359# define PRINTF_INT32_DEC_WIDTH "10"
360#endif
361#ifndef PRINTF_INT16_DEC_WIDTH
362# define PRINTF_INT16_DEC_WIDTH "5"
363#endif
364#ifndef PRINTF_INT8_DEC_WIDTH
365# define PRINTF_INT8_DEC_WIDTH "3"
366#endif
367
368/*
369 * Ok, lets not worry about 128 bit integers for now. Moore's law says
370 * we don't need to worry about that until about 2040 at which point
371 * we'll have bigger things to worry about.
372 */
373
374#ifdef stdint_int64_defined
375 typedef int64_t intmax_t;
376 typedef uint64_t uintmax_t;
377# define INTMAX_MAX INT64_MAX
378# define INTMAX_MIN INT64_MIN
379# define UINTMAX_MAX UINT64_MAX
380# define UINTMAX_C(v) UINT64_C(v)
381# define INTMAX_C(v) INT64_C(v)
382# ifndef PRINTF_INTMAX_MODIFIER
383# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER
384# endif
385# ifndef PRINTF_INTMAX_HEX_WIDTH
386# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH
387# endif
388# ifndef PRINTF_INTMAX_DEC_WIDTH
389# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH
390# endif
391#else
394# define INTMAX_MAX INT32_MAX
395# define UINTMAX_MAX UINT32_MAX
396# define UINTMAX_C(v) UINT32_C(v)
397# define INTMAX_C(v) INT32_C(v)
398# ifndef PRINTF_INTMAX_MODIFIER
399# define PRINTF_INTMAX_MODIFIER PRINTF_INT32_MODIFIER
400# endif
401# ifndef PRINTF_INTMAX_HEX_WIDTH
402# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT32_HEX_WIDTH
403# endif
404# ifndef PRINTF_INTMAX_DEC_WIDTH
405# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT32_DEC_WIDTH
406# endif
407#endif
408
409/*
410 * Because this file currently only supports platforms which have
411 * precise powers of 2 as bit sizes for the default integers, the
412 * least definitions are all trivial. Its possible that a future
413 * version of this file could have different definitions.
414 */
415
416#ifndef stdint_least_defined
423# define PRINTF_LEAST32_MODIFIER PRINTF_INT32_MODIFIER
424# define PRINTF_LEAST16_MODIFIER PRINTF_INT16_MODIFIER
425# define UINT_LEAST8_MAX UINT8_MAX
426# define INT_LEAST8_MAX INT8_MAX
427# define UINT_LEAST16_MAX UINT16_MAX
428# define INT_LEAST16_MAX INT16_MAX
429# define UINT_LEAST32_MAX UINT32_MAX
430# define INT_LEAST32_MAX INT32_MAX
431# define INT_LEAST8_MIN INT8_MIN
432# define INT_LEAST16_MIN INT16_MIN
433# define INT_LEAST32_MIN INT32_MIN
434# ifdef stdint_int64_defined
435 typedef int64_t int_least64_t;
436 typedef uint64_t uint_least64_t;
437# define PRINTF_LEAST64_MODIFIER PRINTF_INT64_MODIFIER
438# define UINT_LEAST64_MAX UINT64_MAX
439# define INT_LEAST64_MAX INT64_MAX
440# define INT_LEAST64_MIN INT64_MIN
441# endif
442#endif
443#undef stdint_least_defined
444
445/*
446 * The ANSI C committee pretending to know or specify anything about
447 * performance is the epitome of misguided arrogance. The mandate of
448 * this file is to *ONLY* ever support that absolute minimum
449 * definition of the fast integer types, for compatibility purposes.
450 * No extensions, and no attempt to suggest what may or may not be a
451 * faster integer type will ever be made in this file. Developers are
452 * warned to stay away from these types when using this or any other
453 * stdint.h.
454 */
455
462#define UINT_FAST8_MAX UINT_LEAST8_MAX
463#define INT_FAST8_MAX INT_LEAST8_MAX
464#define UINT_FAST16_MAX UINT_LEAST16_MAX
465#define INT_FAST16_MAX INT_LEAST16_MAX
466#define UINT_FAST32_MAX UINT_LEAST32_MAX
467#define INT_FAST32_MAX INT_LEAST32_MAX
468#define INT_FAST8_MIN INT_LEAST8_MIN
469#define INT_FAST16_MIN INT_LEAST16_MIN
470#define INT_FAST32_MIN INT_LEAST32_MIN
471#ifdef stdint_int64_defined
472 typedef int_least64_t int_fast64_t;
473 typedef uint_least64_t uint_fast64_t;
474# define UINT_FAST64_MAX UINT_LEAST64_MAX
475# define INT_FAST64_MAX INT_LEAST64_MAX
476# define INT_FAST64_MIN INT_LEAST64_MIN
477#endif
478
479#undef stdint_int64_defined
480
481/*
482 * Whatever piecemeal, per compiler thing we can do about the wchar_t
483 * type limits.
484 */
485
486#if defined(__WATCOMC__) || defined(_MSC_VER) || defined (__GNUC__)
487# include <wchar.h>
488# ifndef WCHAR_MIN
489# define WCHAR_MIN 0
490# endif
491# ifndef WCHAR_MAX
492# define WCHAR_MAX ((wchar_t)-1)
493# endif
494#endif
495
496/*
497 * Whatever piecemeal, per compiler/platform thing we can do about the
498 * (u)intptr_t types and limits.
499 */
500
501#if defined (_MSC_VER) && defined (_UINTPTR_T_DEFINED)
502# define STDINT_H_UINTPTR_T_DEFINED
503#endif
504
505#ifndef STDINT_H_UINTPTR_T_DEFINED
506# if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) || defined (_WIN64)
507# define stdint_intptr_bits 64
508# elif defined (__WATCOMC__) || defined (__TURBOC__)
509# if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
510# define stdint_intptr_bits 16
511# else
512# define stdint_intptr_bits 32
513# endif
514# elif defined (__i386__) || defined (_WIN32) || defined (WIN32)
515# define stdint_intptr_bits 32
516# elif defined (__INTEL_COMPILER)
517/* TODO -- what will Intel do about x86-64? */
518# endif
519
520# ifdef stdint_intptr_bits
521# define stdint_intptr_glue3_i(a,b,c) a##b##c
522# define stdint_intptr_glue3(a,b,c) stdint_intptr_glue3_i(a,b,c)
523# ifndef PRINTF_INTPTR_MODIFIER
524# define PRINTF_INTPTR_MODIFIER stdint_intptr_glue3(PRINTF_INT,stdint_intptr_bits,_MODIFIER)
525# endif
526# ifndef PTRDIFF_MAX
527# define PTRDIFF_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX)
528# endif
529# ifndef PTRDIFF_MIN
530# define PTRDIFF_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN)
531# endif
532# ifndef UINTPTR_MAX
533# define UINTPTR_MAX stdint_intptr_glue3(UINT,stdint_intptr_bits,_MAX)
534# endif
535# ifndef INTPTR_MAX
536# define INTPTR_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX)
537# endif
538# ifndef INTPTR_MIN
539# define INTPTR_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN)
540# endif
541# ifndef INTPTR_C
542# define INTPTR_C(x) stdint_intptr_glue3(INT,stdint_intptr_bits,_C)(x)
543# endif
544# ifndef UINTPTR_C
545# define UINTPTR_C(x) stdint_intptr_glue3(UINT,stdint_intptr_bits,_C)(x)
546# endif
547 typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t)* uintptr_t;
548 typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t)* intptr_t;
549# else
550/* TODO -- This following is likely wrong for some platforms, and does
551 nothing for the definition of uintptr_t. */
552 typedef ptrdiff_t intptr_t;
553# endif
554# define STDINT_H_UINTPTR_T_DEFINED
555#endif
556
557/*
558 * Assumes sig_atomic_t is signed and we have a 2s complement machine.
559 */
560
561#ifndef SIG_ATOMIC_MAX
562# define SIG_ATOMIC_MAX ((((sig_atomic_t) 1) << (sizeof (sig_atomic_t)*CHAR_BIT-1)) - 1)
563#endif
564
565#endif
566
567#endif // guard
568
unsigned long uint32_t
Definition: pstdint.h:216
int16_t int_least16_t
Definition: pstdint.h:419
int32_t intmax_t
Definition: pstdint.h:392
unsigned int uint16_t
Definition: pstdint.h:170
int32_t int_least32_t
Definition: pstdint.h:421
signed long int32_t
Definition: pstdint.h:247
int_least16_t int_fast16_t
Definition: pstdint.h:458
uint16_t uint_least16_t
Definition: pstdint.h:420
uint_least32_t uint_fast32_t
Definition: pstdint.h:461
#define stdint_intptr_glue3(a, b, c)
Definition: pstdint.h:522
uint32_t uintmax_t
Definition: pstdint.h:393
int_least8_t int_fast8_t
Definition: pstdint.h:456
#define stdint_intptr_bits
Definition: pstdint.h:515
signed int int16_t
Definition: pstdint.h:194
int8_t int_least8_t
Definition: pstdint.h:417
unsigned char uint8_t
Definition: pstdint.h:143
uint32_t uint_least32_t
Definition: pstdint.h:422
uint8_t uint_least8_t
Definition: pstdint.h:418
uint_least16_t uint_fast16_t
Definition: pstdint.h:459
int_least32_t int_fast32_t
Definition: pstdint.h:460
uint_least8_t uint_fast8_t
Definition: pstdint.h:457
signed char int8_t
Definition: pstdint.h:158



Page generated by Doxygen 1.9.6 for MRPT 1.4.0 SVN: at Wed Mar 22 06:08:57 UTC 2023