#include <stdio.h>
#include <string.h>
char *print_x(char *str)
{
union
{
int i;
unsigned u;
long l;
long long ll;
float f;
double d;
}data;
switch(*str)
{
case 'd':
memcpy(&data
, str
+ 1, sizeof(double)); return str + 1 + sizeof(double);
case 'i':
memcpy(&data
, str
+ 1, sizeof(int)); return str + 1 + sizeof(int);
/* another formats */
default:
return NULL;
}
}
int main()
{
char data[100];
double x = 1.234;
int z = 4567;
char *str = data;
data[0] = 'd';
memcpy(&data
[1], &x
, sizeof(double)); data[1 + sizeof(double)] = 'i';
memcpy(&data
[2 + sizeof(double)], &z
, sizeof(int));
while((str = print_x(str)))
{
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCmNoYXIgKnByaW50X3goY2hhciAqc3RyKQp7CiAgICB1bmlvbgogICAgewogICAgICAgIGludCBpOwogICAgICAgIHVuc2lnbmVkIHU7CiAgICAgICAgbG9uZyBsOwogICAgICAgIGxvbmcgbG9uZyBsbDsKICAgICAgICBmbG9hdCBmOwogICAgICAgIGRvdWJsZSBkOwogICAgfWRhdGE7CiAgICAKICAgIHN3aXRjaCgqc3RyKQogICAgewogICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICBtZW1jcHkoJmRhdGEsIHN0ciArIDEsIHNpemVvZihkb3VibGUpKTsKICAgICAgICAgICAgcHJpbnRmKCIlZiIsIGRhdGEuZCk7CiAgICAgICAgICAgIHJldHVybiBzdHIgKyAxICsgc2l6ZW9mKGRvdWJsZSk7CiAgICAgICAgY2FzZSAnaSc6CiAgICAgICAgICAgIG1lbWNweSgmZGF0YSwgc3RyICsgMSwgc2l6ZW9mKGludCkpOwogICAgICAgICAgICBwcmludGYoIiVkIiwgZGF0YS5pKTsKICAgICAgICAgICAgcmV0dXJuIHN0ciArIDEgKyBzaXplb2YoaW50KTsKICAgICAgICAvKiBhbm90aGVyIGZvcm1hdHMgKi8KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBwcmludGYoIk5vdCBpbXBsZW1lbnRlZCIpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBjaGFyIGRhdGFbMTAwXTsKICAgIGRvdWJsZSB4ID0gMS4yMzQ7CiAgICBpbnQgeiA9IDQ1Njc7CiAgICAKICAgIGNoYXIgKnN0ciA9IGRhdGE7CiAgICAKICAgIGRhdGFbMF0gPSAnZCc7CiAgICBtZW1jcHkoJmRhdGFbMV0sICZ4LCBzaXplb2YoZG91YmxlKSk7CiAgICBkYXRhWzEgKyBzaXplb2YoZG91YmxlKV0gPSAnaSc7CiAgICBtZW1jcHkoJmRhdGFbMiArIHNpemVvZihkb3VibGUpXSwgJnosIHNpemVvZihpbnQpKTsKICAgIAogICAgd2hpbGUoKHN0ciA9IHByaW50X3goc3RyKSkpCiAgICB7CiAgICAJcHJpbnRmKCJcbiIpOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==