/*
 * C Object Notation
 * JSON for C
 * */

typedef struct O{
    union {
        unsigned char data[8]; //data is 64bits size
        char boolean;   //8bits byte
        long integer;   //64bits integer
        double real; //double 64 bits real number
        char * string; //string pointer
        struct O * list; //array of O
    } any;
    enum {
        string,
        integer,
        real,
        boolean,
        list,
        map
    } T;
} O;

long toInt(O o){
    return o.any.integer;
}

double toReal(O o){
    return o.any.real;
}

char toBool(O o){
    return o.any.boolean;
}

char * toString(O o){
    return o.any.string;
}

O * toArray(O o){
    return o.any.list;
}

O fromInt(long i){
    return (O){.any.integer=i,T=O.T.integer};
}

O fromReal(double l){
    return (O){.any.real=l};
}

O fromBool(char b){
    return (O){.any.boolean=b};
}

O fromString(char * s){
    return (O){.any.string=s};
}

O fromArray(O * a){
    return (O){.any.list=a};
}
