Tuple (itable)
/******************************************************************************
New Era Datastructure
by Daipayan Bhowal
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
typedef enum Type
{
CHAR,
INT,
FLOAT,
DOUBLE,
SHORT,
LONG,
LONG_LONG
}type_t;
typedef struct Tables
{
int index;
int type[64];
void * args[64];
char max_index;
} tables;
typedef tables* table_t;
table_t itable(int num,...) // init_table
{
va_list valist;
va_start(valist, num);
static int counter =0;
table_t t = (table_t)malloc(sizeof(tables));
t->index= ++counter;
for(int j=0; j< num; j++)
{
t->type[j] = va_arg(valist, type_t);
}
t->max_index = num;
va_end(valist);
return t;
}
void itable_set(table_t t,int num,...)
{
va_list valist;
va_start(valist, num);
for(int j=0; j< num; j++)
{
switch(t->type[j])
{
case CHAR:
{
char *c = (char*) malloc(sizeof(char));
char c2 = (char) va_arg(valist, int);
memcpy(c,&c2,sizeof(char));
t->args[j] = (void*) c;
break;
}
case INT:
{
int *i = (int*) malloc(sizeof(int));
int i2 = va_arg(valist, int);
memcpy(i,&i2, sizeof(int));
t->args[j] = (void*) i;
break;
}
case FLOAT:
{
float *f = (float*) malloc(sizeof(float));
float f2 = (float) va_arg(valist, double);
memcpy(f,&f2, sizeof(float));
t->args[j] = (void *)f;
break;
}
case DOUBLE:
{
double *d = (double *) malloc(sizeof(double));
double d2 = va_arg(valist, double);
memcpy(d,&d2,sizeof(double));
t->args[j] = (void *)d;
break;
}
case SHORT:
{
short *s = (short *) malloc(sizeof(short));
short s2= (short) va_arg(valist, int);
memcpy(s,&s2,sizeof(short));
t->args[j] = (void *)s;
break;
}
case LONG:
{
long *l = (long *) malloc(sizeof(long));
long l2 = (long) va_arg(valist, long);
memcpy(l,&l2,sizeof(long));
t->args[j] = (void *) l;
break;
}
case LONG_LONG:
{
long long *ll = (long long*) malloc(sizeof(long long));
long long ll2= (long long) va_arg(valist, long long);
memcpy(ll,&ll2,sizeof(long long));
t->args[j] = (void *) ll;
break;
}
}
}
va_end(valist);
}
void itable_get(table_t t)
{
int num = t->max_index;
for(int j=0; j<num; j++)
{
switch(t->type[j])
{
case CHAR:
printf("%c\n", *(char*)t->args[j] );
break;
case INT:
printf("%d\n", *(int*)t->args[j]);
break;
case FLOAT:
printf("%f\n", *(float*)t->args[j]);
break;
case DOUBLE:
printf("%lf\n", *(double*)t->args[j]);
break;
case SHORT:
printf("%d\n", *(short*)t->args[j]);
break;
case LONG:
printf("%l\n", *(long*)t->args[j]);
break;
case LONG_LONG:
printf("%ll\n", *(long long*)t->args[j]);
break;
}
}
}
int main()
{
table_t i= itable(4, INT, CHAR, CHAR,CHAR);
itable_set(i,4, 5, 'a','b','c');
itable_get(i);
return 0;
}
Comments
Post a Comment