#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==