#include <assert.h>
#include <stdio.h>
#include <string.h>
#define yoba_swap(foo, bar) do { \
char temp[sizeof(foo)]; \
assert(sizeof(foo) == sizeof(bar)); \
memcpy(&temp, &foo, sizeof(foo)); \
memcpy(&foo, &bar, sizeof(foo)); \
memcpy(&bar, &temp, sizeof(foo)); \
} while (0)
int main(void)
{
int a1[3] = { 1, 2, 3 };
int a2[3] = { 4, 5, 6 };
printf("Before: a1 = { %d, %d, %d }; a2 = { %d, %d, %d }\n", a1
[0], a1
[1], a1
[2], a2
[0], a2
[1], a2
[2]); yoba_swap(a1, a2);
printf("After: a1 = { %d, %d, %d }; a2 = { %d, %d, %d }\n", a1
[0], a1
[1], a1
[2], a2
[0], a2
[1], a2
[2]); double d1 = 1.0;
double d2 = 2.0;
printf("Before: d1 = %g, d2 = %g\n", d1
, d2
); yoba_swap(d1, d2);
printf("After: d1 = %g, d2 = %g\n", d1
, d2
); }
I2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSB5b2JhX3N3YXAoZm9vLCBiYXIpIGRvIHsgIFwKICAgIGNoYXIgdGVtcFtzaXplb2YoZm9vKV07ICAgICAgICAgICAgIFwKICAgIGFzc2VydChzaXplb2YoZm9vKSA9PSBzaXplb2YoYmFyKSk7IFwKICAgIG1lbWNweSgmdGVtcCwgJmZvbywgc2l6ZW9mKGZvbykpOyAgIFwKICAgIG1lbWNweSgmZm9vLCAmYmFyLCBzaXplb2YoZm9vKSk7ICAgIFwKICAgIG1lbWNweSgmYmFyLCAmdGVtcCwgc2l6ZW9mKGZvbykpOyAgIFwKfSB3aGlsZSAoMCkKCgppbnQgbWFpbih2b2lkKQp7CiAgICBwcmludGYoIkFycmF5czpcbiIpOwogICAgaW50IGExWzNdID0geyAxLCAyLCAzIH07CiAgICBpbnQgYTJbM10gPSB7IDQsIDUsIDYgfTsKICAgIHByaW50ZigiQmVmb3JlOiBhMSA9IHsgJWQsICVkLCAlZCB9OyBhMiA9IHsgJWQsICVkLCAlZCB9XG4iLCBhMVswXSwgYTFbMV0sIGExWzJdLCBhMlswXSwgYTJbMV0sIGEyWzJdKTsKICAgIHlvYmFfc3dhcChhMSwgYTIpOwogICAgcHJpbnRmKCJBZnRlcjogIGExID0geyAlZCwgJWQsICVkIH07IGEyID0geyAlZCwgJWQsICVkIH1cbiIsIGExWzBdLCBhMVsxXSwgYTFbMl0sIGEyWzBdLCBhMlsxXSwgYTJbMl0pOwogICAgcHJpbnRmKCJTaW5nbGUgdmFsdWVzOlxuIik7CiAgICBkb3VibGUgZDEgPSAxLjA7CiAgICBkb3VibGUgZDIgPSAyLjA7CiAgICBwcmludGYoIkJlZm9yZTogZDEgPSAlZywgZDIgPSAlZ1xuIiwgZDEsIGQyKTsKICAgIHlvYmFfc3dhcChkMSwgZDIpOwogICAgcHJpbnRmKCJBZnRlcjogIGQxID0gJWcsIGQyID0gJWdcbiIsIGQxLCBkMik7Cn0K