#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum VTYPE { VSTRING, VINT, VFLOAT} ;
typedef enum VTYPE vtype;
struct Value {
vtype typ;
/*
type=1 ==> get vstring
type=2 ==> get int
type=3 ==> get float
*/
union {
char * vstring;
int vint;
float vfloat;
} ;
} ;
void clear( struct Value* vall) {
if ( vall-> typ == VSTRING) {
}
memset ( vall
, 0 , sizeof ( * vall
) ) ; }
void print_value( struct Value * v)
{
static const char * types[ ] = { "VSTRING" , "VINT" , "VFLOAT" } ;
printf ( "ValueType : %s\n " , v
-> typ
>= 0 && v
-> typ
< 3 ? types
[ v
-> typ
] : "ERROR" ) ; if ( VSTRING == v-> typ) {
printf ( "ValueString : %s\n " , v
-> vstring
) ; }
else if ( VINT == v-> typ) {
printf ( "ValueInt : %d\n " , v
-> vint
) ; }
else if ( VFLOAT == v-> typ) {
printf ( "ValueFloat : %f\n " , v
-> vfloat
) ; }
}
void copy_value( struct Value * source, struct Value * dest) {
if ( VSTRING == source-> typ) {
strcpy ( dest
-> vstring
, source
-> vstring
) ; }
else if ( VINT == source-> typ) {
dest-> vint = source-> vint;
}
else if ( VFLOAT == source-> typ) {
dest-> vfloat = source-> vfloat;
}
dest-> typ = source-> typ;
}
int main( )
{
const char * msg = "C Programming/may this a very big utf-8 string!" ;
struct Value v;
/////////////////////////////////////////////
v.typ = VSTRING;
print_value( & v) ;
struct Value copy;
copy_value( & v, & copy) ;
print_value( & copy) ;
clear( & copy) ;
copy.typ = VINT;
copy.vint = 5 ;
print_value( & copy) ;
clear( & v) ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKZW51bSBWVFlQRSB7VlNUUklORywgVklOVCwgVkZMT0FUfTsKdHlwZWRlZiBlbnVtIFZUWVBFIHZ0eXBlOwpzdHJ1Y3QgVmFsdWUgewogICB2dHlwZSB0eXA7CiAgIC8qCiAgIHR5cGU9MSAgPT0+IGdldCB2c3RyaW5nCiAgIHR5cGU9MiAgPT0+IGdldCBpbnQKICAgdHlwZT0zICA9PT4gZ2V0IGZsb2F0CiAgICovCiAgIHVuaW9uIHsKICAgCWNoYXIgKnZzdHJpbmc7CiAgIAlpbnQgICB2aW50OwogICAJZmxvYXQgIHZmbG9hdDsKICAgfTsKfTsKCnZvaWQgY2xlYXIoc3RydWN0IFZhbHVlKiB2YWxsKXsKICAgaWYgKHZhbGwtPnR5cCA9PSBWU1RSSU5HKXsKICAgICAgZnJlZSh2YWxsLT52c3RyaW5nKTsKICAgfQogICBtZW1zZXQodmFsbCwgMCwgc2l6ZW9mKCp2YWxsKSk7Cn0KCnZvaWQgcHJpbnRfdmFsdWUoc3RydWN0IFZhbHVlICp2KQp7CglzdGF0aWMgY29uc3QgY2hhciAqdHlwZXNbXSA9IHsiVlNUUklORyIsICJWSU5UIiwgIlZGTE9BVCJ9OwoJcHJpbnRmKCAiVmFsdWVUeXBlIDogJXNcbiIsIHYtPnR5cCA+PSAwICYmIHYtPnR5cCA8IDMgPyB0eXBlc1t2LT50eXBdIDogIkVSUk9SIik7CglpZiAoVlNUUklORyA9PSB2LT50eXApIHsKICAgIAlwcmludGYoICJWYWx1ZVN0cmluZyA6ICVzXG4iLCB2LT52c3RyaW5nKTsKCX0KCWVsc2UgaWYgKFZJTlQgPT0gdi0+dHlwKSB7CiAgICAJcHJpbnRmKCAiVmFsdWVJbnQgOiAlZFxuIiwgdi0+dmludCk7Cgl9CgllbHNlIGlmIChWRkxPQVQgPT0gdi0+dHlwKSB7CiAgICAJcHJpbnRmKCAiVmFsdWVGbG9hdCA6ICVmXG4iLCB2LT52ZmxvYXQpOwoJfQp9Cgp2b2lkIGNvcHlfdmFsdWUoc3RydWN0IFZhbHVlICpzb3VyY2UsIHN0cnVjdCBWYWx1ZSAqZGVzdCkgewoJaWYgKFZTVFJJTkcgPT0gc291cmNlLT50eXApIHsKICAgIAlkZXN0LT52c3RyaW5nID0gbWFsbG9jKHN0cmxlbihzb3VyY2UtPnZzdHJpbmcpICsgMSk7CiAgICAJc3RyY3B5KGRlc3QtPnZzdHJpbmcsIHNvdXJjZS0+dnN0cmluZyk7Cgl9CgllbHNlIGlmIChWSU5UID09IHNvdXJjZS0+dHlwKSB7CiAgICAJZGVzdC0+dmludCA9IHNvdXJjZS0+dmludDsKCX0KCWVsc2UgaWYgKFZGTE9BVCA9PSBzb3VyY2UtPnR5cCkgewogICAgCWRlc3QtPnZmbG9hdCA9IHNvdXJjZS0+dmZsb2F0OwoJfQoJZGVzdC0+dHlwID0gc291cmNlLT50eXA7Cn0KCmludCBtYWluKCkKewoJY29uc3QgY2hhciAqbXNnID0gIkMgUHJvZ3JhbW1pbmcvbWF5IHRoaXMgYSB2ZXJ5IGJpZyB1dGYtOCBzdHJpbmchIjsKICAgc3RydWN0IFZhbHVlIHY7CiAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICB2LnR5cD1WU1RSSU5HOwogICB2LnZzdHJpbmcgPSBtYWxsb2Moc3RybGVuKG1zZykgKyAxKTsKICAgc3RyY3B5KHYudnN0cmluZywgbXNnKTsKICAgcHJpbnRfdmFsdWUoJnYpOwogICAKCglzdHJ1Y3QgVmFsdWUgY29weTsKCWNvcHlfdmFsdWUoJnYsICZjb3B5KTsKCXByaW50X3ZhbHVlKCZjb3B5KTsKICAgY2xlYXIoJmNvcHkpOwogICBjb3B5LnR5cD1WSU5UOwogICBjb3B5LnZpbnQ9NTsKICAgcHJpbnRfdmFsdWUoJmNvcHkpOwogICAKICAgY2xlYXIoJnYpOwp9Cg==