amarullz

dynamic library load - for squirrel

Jul 12th, 2015
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.19 KB | None | 0 0
  1. /* <aromaembed.h> */
  2.  
  3. #include <string.h>
  4.  
  5. #define TYPE_BOOL     'b'
  6. #define TYPE_INT      'i'
  7. #define TYPE_STRING   's'
  8. #define TYPE_FLOAT    'f'
  9. #define TYPE_DOUBLE   'd'
  10. #define TYPE_POINTER  'p'
  11.  
  12. #define RET_BOOL_TRUE  1
  13. #define RET_BOOL_FALSE 0
  14.  
  15. /* dynamic variable structure */
  16. typedef struct{
  17.   void * data;  /* data pointer */
  18.   char   type;  /* data type */
  19.   size_t sz;    /* data size */
  20. } APP_VAR;
  21.  
  22. /* function argument structure */
  23. typedef struct{
  24.   APP_VAR * argv;     /* function arguments */
  25.   int       argn;     /* number of arguments */
  26.   APP_VAR   retval;   /* return value */
  27. } APP_ARG;
  28.  
  29. /* function */
  30. typedef int (*APP_FN)(APP_ARG *);
  31.  
  32. /* register function */
  33. typedef struct{
  34.   APP_FN fn;          /* callback */
  35.   const char *  name; /* function name */
  36. } APP_FN_REG;
  37.  
  38. inline int app_return_string(APP_ARG * v, char * str){
  39.   if (v&&str){
  40.     int len = strlen(str);
  41.     char * out = (char *) malloc(len+1);
  42.     snprintf(out,len+1,"%s",str);
  43.     v->retval.data = (void *) out;
  44.     v->retval.type = TYPE_STRING;
  45.     v->retval.sz   = len;
  46.     return 1;
  47.   }
  48.   return 0;
  49. }
  50.  
  51. inline int app_return_int(APP_ARG * v, int value){
  52.   if (v){
  53.     int * out = (int *) malloc(sizeof(int));
  54.     out[0]=value;
  55.     v->retval.data = (void *) out;
  56.     v->retval.type = TYPE_INT;
  57.     v->retval.sz   = sizeof(int);
  58.     return 1;
  59.   }
  60.   return 0;
  61. }
  62.  
  63. inline int app_return_bool(APP_ARG * v, char value){
  64.   if (v){
  65.     char * out = (char *) malloc(sizeof(char));
  66.     out[0]=value?1:0;
  67.     v->retval.data = (void *) out;
  68.     v->retval.type = TYPE_BOOL;
  69.     v->retval.sz   = sizeof(char);
  70.     return 1;
  71.   }
  72.   return 0;
  73. }
  74.  
  75. inline int app_return_float(APP_ARG * v, float value){
  76.   if (v){
  77.     float * out = (float *) malloc(sizeof(float));
  78.     out[0]=value;
  79.     v->retval.data = (void *) out;
  80.     v->retval.type = TYPE_DOUBLE;
  81.     v->retval.sz   = sizeof(float);
  82.     return 1;
  83.   }
  84.   return 0;
  85. }
  86.  
  87. inline int app_return_double(APP_ARG * v, double value){
  88.   if (v){
  89.     double * out = (double *) malloc(sizeof(double));
  90.     out[0]=value;
  91.     v->retval.data = (void *) out;
  92.     v->retval.type = TYPE_FLOAT;
  93.     v->retval.sz   = sizeof(double);
  94.     return 1;
  95.   }
  96.   return 0;
  97. }
  98.  
  99. -------------------------------------------------------------------------------------------
  100. /* EXAMPLE OF LIBRARY SOURCE */
  101. <aromaembed.h>
  102.  
  103. int print_something(APP_ARG * v){
  104.   if (v->argn==1){
  105.     if (v->argv[0].type==TYPE_STRING){
  106.       /* string */
  107.       char * text = (char *) v->argv[0].data;
  108.       printf("print_something with argument: %s",text);
  109.     }
  110.   }
  111.   return 0; /* no return */
  112. }
  113.  
  114. int get_ok(APP_ARG * v){
  115.   return app_return_string(v, "OK");
  116. }
  117.  
  118.  
  119. int app_start(){
  120.   return 1; /* have register */
  121. }
  122.  
  123. static APP_FN_REG _app_func[]={
  124.   { print_something, "print" },
  125.   { get_ok, "get_ok" },
  126.   { 0, 0 } /* end of app regs */
  127. };
  128.  
  129. APP_FN_REG * app_reg(){
  130.   return _app_func;
  131. }
  132.  
  133. -------------------------------------------------------------------------------------------
  134. /* nut/squirrel test */
  135. if (Application.LoadLibrary("main.so","MainClass")){
  136.   MainClass::print("Hello World");
  137.   local retget = MainClass::get_ok();
  138.   MainClass::print(retget);
  139. }
Advertisement
Add Comment
Please, Sign In to add comment