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