Skip to content

Instantly share code, notes, and snippets.

@nigoroll
Last active October 4, 2021 14:05
Show Gist options
  • Save nigoroll/2f9833e5b0635787608e7a45a3a37622 to your computer and use it in GitHub Desktop.
Save nigoroll/2f9833e5b0635787608e7a45a3a37622 to your computer and use it in GitHub Desktop.
suncc 5.13
[uplex@vtest2 ~]$ cc -V
cc: Sun C 5.13 SunOS_i386 2014/10/20
[uplex@vtest2 ~]$ cc /tmp/t.c
[uplex@vtest2 ~]$ ./a.out
vmin(5, 8): 5
vmax(5, 8): 8
vmin(a, b): 5
vmax(a, b): 8
vlimit(a, 6, 7): 6
vlimit(b, 6, 7): 7
[uplex@vtest2 ~]$ cat /tmp/t.c
#include <stdio.h>
#define VINDIRECT(a, b, c) a ## b ## c
#define VCOMBINE(a, b, c) VINDIRECT(a, b, c)
#if defined(__COUNTER__)
# define VUNIQ_NAME(base) VCOMBINE(base, __LINE__, __COUNTER__)
#else
# define VUNIQ_NAME(base) VCOMBINE(base, __LINE__, 0)
#endif
/* ref: https://gcc.gnu.org/onlinedocs/gcc/Typeof.html */
#define _vmin(a, b, _va, _vb) \
({ \
typeof (a) _va = (a); \
typeof (b) _vb = (b); \
(void)(&_va == &_vb); \
_va < _vb ? _va : _vb; \
})
#define _vmax(a, b, _va, _vb) \
({ \
typeof (a) _va = (a); \
typeof (b) _vb = (b); \
(void)(&_va == &_vb); \
_va > _vb ? _va : _vb; \
})
#define vmin(a, b) _vmin((a), (b), VUNIQ_NAME(_va), VUNIQ_NAME(_vb))
#define vmax(a, b) _vmax((a), (b), VUNIQ_NAME(_va), VUNIQ_NAME(_vb))
#define vmin_t(type, a, b) vmin((type)(a), (type)(b))
#define vmax_t(type, a, b) vmax((type)(a), (type)(b))
/**********************************************************************
* * Clamp the value between two limits.
* */
#define vlimit(a, l, u) vmax((l), vmin((a), (u)))
#define vlimit_t(type, a, l, u) vmax_t(type, (l), vmin_t(type, (a), (u)))
#define T(expr) printf(#expr ": %d\n", expr)
void main()
{
int a = 5, b = 8;
T(vmin(5, 8));
T(vmax(5, 8));
T(vmin(a, b));
T(vmax(a, b));
T(vlimit(a, 6, 7));
T(vlimit(b, 6, 7));
}
[uplex@vtest2 ~]$ cc -E /tmp/t.c | awk '/main/ {p=1;} /./ { if(p) {print $0;}}'
void main()
{
int a = 5, b = 8;
printf ( "vmin(5, 8)" ": %d\n" , ( { typeof ( ( 5 ) ) _va490 = ( ( 5 ) ) ; typeof ( ( 8 ) ) _vb490 = ( ( 8 ) ) ; ( void ) ( & _va490 == & _vb490 ) ; _va490 < _vb490 ? _va490 : _vb490 ; } ) );
printf ( "vmax(5, 8)" ": %d\n" , ( { typeof ( ( 5 ) ) _va500 = ( ( 5 ) ) ; typeof ( ( 8 ) ) _vb500 = ( ( 8 ) ) ; ( void ) ( & _va500 == & _vb500 ) ; _va500 > _vb500 ? _va500 : _vb500 ; } ) );
printf ( "vmin(a, b)" ": %d\n" , ( { typeof ( ( a ) ) _va510 = ( ( a ) ) ; typeof ( ( b ) ) _vb510 = ( ( b ) ) ; ( void ) ( & _va510 == & _vb510 ) ; _va510 < _vb510 ? _va510 : _vb510 ; } ) );
printf ( "vmax(a, b)" ": %d\n" , ( { typeof ( ( a ) ) _va520 = ( ( a ) ) ; typeof ( ( b ) ) _vb520 = ( ( b ) ) ; ( void ) ( & _va520 == & _vb520 ) ; _va520 > _vb520 ? _va520 : _vb520 ; } ) );
printf ( "vlimit(a, 6, 7)" ": %d\n" , ( { typeof ( ( ( 6 ) ) ) _va530 = ( ( ( 6 ) ) ) ; typeof ( ( ( { typeof ( ( ( a ) ) ) _va530 = ( ( ( a ) ) ) ; typeof ( ( ( 7 ) ) ) _vb530 = ( ( ( 7 ) ) ) ; ( void ) ( & _va530 == & _vb530 ) ; _va530 < _vb530 ? _va530 : _vb530 ; } ) ) ) _vb530 = ( ( ( { typeof ( ( ( a ) ) ) _va530 = ( ( ( a ) ) ) ; typeof ( ( ( 7 ) ) ) _vb530 = ( ( ( 7 ) ) ) ; ( void ) ( & _va530 == & _vb530 ) ; _va530 < _vb530 ? _va530 : _vb530 ; } ) ) ) ; ( void ) ( & _va530 == & _vb530 ) ; _va530 > _vb530 ? _va530 : _vb530 ; } ) );
printf ( "vlimit(b, 6, 7)" ": %d\n" , ( { typeof ( ( ( 6 ) ) ) _va540 = ( ( ( 6 ) ) ) ; typeof ( ( ( { typeof ( ( ( b ) ) ) _va540 = ( ( ( b ) ) ) ; typeof ( ( ( 7 ) ) ) _vb540 = ( ( ( 7 ) ) ) ; ( void ) ( & _va540 == & _vb540 ) ; _va540 < _vb540 ? _va540 : _vb540 ; } ) ) ) _vb540 = ( ( ( { typeof ( ( ( b ) ) ) _va540 = ( ( ( b ) ) ) ; typeof ( ( ( 7 ) ) ) _vb540 = ( ( ( 7 ) ) ) ; ( void ) ( & _va540 == & _vb540 ) ; _va540 < _vb540 ? _va540 : _vb540 ; } ) ) ) ; ( void ) ( & _va540 == & _vb540 ) ; _va540 > _vb540 ? _va540 : _vb540 ; } ) );
}
#ident "acomp: Sun C 5.13 SunOS_i386 2014/10/20"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment