void ring_vm_refmeta_isclass ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2 ; char *cStr ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_GETSTRING(1) ) { pVM = (VM *) pPointer ; cStr = RING_API_GETSTRING(1) ; ring_string_lower(cStr); pList = pVM->pClassesMap ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList2 = ring_list_getlist(pList,x); if ( strcmp(ring_list_getstring(pList2,RING_CLASSMAP_CLASSNAME),cStr) == 0 ) { RING_API_RETNUMBER(1); return ; } } RING_API_RETNUMBER(0); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_refmeta_iscfunction ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2 ; const char *cStr ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_GETSTRING(1) ) { pVM = (VM *) pPointer ; cStr = RING_API_GETSTRING(1) ; pList = pVM->pCFunctionsList ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList2 = ring_list_getlist(pList,x); if ( strcmp(ring_list_getstring(pList2,RING_FUNCMAP_NAME),cStr) == 0 ) { RING_API_RETNUMBER(1); return ; } } RING_API_RETNUMBER(0); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_refmeta_packageclasses ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2, *pList3 ; char *cStr ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_GETSTRING(1) ) { pVM = (VM *) pPointer ; cStr = RING_API_GETSTRING(1) ; ring_string_lower(cStr); pList = pVM->pPackagesMap ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList2 = ring_list_getlist(pList,x); if ( strcmp(ring_list_getstring(pList2,RING_PACKAGENAME),cStr) == 0 ) { pList3 = RING_API_NEWLIST ; pList2 = ring_list_getlist(pList2,RING_CLASSESLIST) ; /* We can use the variable x for the loop again because we have return */ for ( x = 1 ; x <= ring_list_getsize(pList2) ; x++ ) { ring_list_addstring(pList3,ring_list_getstring(ring_list_getlist(pList2,x),RING_CLASSMAP_CLASSNAME)); } RING_API_RETLIST(pList3); return ; } } RING_API_RETNUMBER(0); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_refmeta_islocal ( void *pPointer ) { VM *pVM ; int x ; List *pList, *pList2 ; const char *cStr ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_GETSTRING(1) ) { pVM = (VM *) pPointer ; cStr = RING_API_GETSTRING(1) ; /* We use -1 to skip the current scope of the locals() function */ pList = ring_list_getlist(pVM->pMem,ring_list_getsize(pVM->pMem)-1) ; for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { pList2 = ring_list_getlist(pList,x); if ( strcmp(ring_list_getstring(pList2,RING_VAR_NAME),cStr) == 0 ) { RING_API_RETNUMBER(1); return ; } } RING_API_RETNUMBER(0); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_dll_loadlib ( void *pPointer ) { LpHandleType handle ; const char *cDLL ; loadlibfuncptr pFunc ; VM *pVM ; RingState *pRingState ; pVM = (VM *) pPointer ; pRingState = pVM->pRingState ; if ( RING_API_PARACOUNT != 1 ) { RING_API_ERROR(RING_API_MISS1PARA); return ; } if ( RING_API_ISSTRING(1) ) { cDLL = RING_API_GETSTRING(1); handle = LoadDLL(cDLL); if ( handle == NULL ) { RING_API_ERROR("Runtime Error in loading the dynamic library!"); return ; } pFunc = (loadlibfuncptr) GetDLLFunc(handle, "ringlib_init") ; if ( pFunc == NULL ) { RING_API_ERROR("The dynamic library doesn't contain the ringlib_init() function!"); return ; } ring_list_deletearray(pRingState->pRingCFunctions); (*pFunc)(pRingState) ; ring_list_genarray(pRingState->pRingCFunctions); ring_list_genhashtable2(pRingState->pRingCFunctions); RING_API_RETCPOINTER(handle,"DLL"); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_odbc_columns ( void *pPointer ) { ring_odbc *pODBC ; SQLRETURN ret ; if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_MISS2PARA); return ; } if ( RING_API_ISPOINTER(1) && RING_API_ISSTRING(2) ) { pODBC = (ring_odbc *) RING_API_GETCPOINTER(1,RING_VM_POINTER_ODBC) ; if ( pODBC == NULL ) { return ; } if ( ! (pODBC->nFlag & RING_ODBC_FLAG_STMT) ) { SQLAllocHandle(SQL_HANDLE_STMT, pODBC->dbc , &pODBC->stmt); pODBC->nFlag = pODBC->nFlag | RING_ODBC_FLAG_STMT ; } ret = SQLColumns(pODBC->stmt, NULL, 0, NULL, 0, (SQLCHAR *) RING_API_GETSTRING(2), SQL_NTS, NULL, 0); if ( SQL_SUCCEEDED(ret) ) { RING_API_RETNUMBER(1); } else { RING_API_RETNUMBER(0); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_odbc_execute ( void *pPointer ) { ring_odbc *pODBC ; SQLRETURN ret ; if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_MISS2PARA); return ; } if ( RING_API_ISPOINTER(1) && RING_API_ISSTRING(2) ) { pODBC = (ring_odbc *) RING_API_GETCPOINTER(1,RING_VM_POINTER_ODBC) ; if ( pODBC == NULL ) { return ; } if ( pODBC->nFlag & RING_ODBC_FLAG_STMT ) { SQLFreeHandle(SQL_HANDLE_STMT,pODBC->stmt); } SQLAllocHandle(SQL_HANDLE_STMT, pODBC->dbc , &pODBC->stmt); ret = SQLExecDirect(pODBC->stmt, (SQLCHAR *) RING_API_GETSTRING(2) , (SQLINTEGER) RING_API_GETSTRINGSIZE(2)); pODBC->nFlag = pODBC->nFlag | RING_ODBC_FLAG_STMT ; if ( SQL_SUCCEEDED(ret) ) { RING_API_RETNUMBER(1); } else { RING_API_RETNUMBER(0); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_odbc_connect ( void *pPointer ) { ring_odbc *pODBC ; SQLCHAR outstr[1024] ; SQLSMALLINT outstrlen ; SQLRETURN ret ; if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_MISS2PARA); return ; } if ( RING_API_ISPOINTER(1) && RING_API_ISSTRING(2) ) { pODBC = (ring_odbc *) RING_API_GETCPOINTER(1,RING_VM_POINTER_ODBC) ; if ( pODBC == NULL ) { return ; } if ( pODBC->nFlag & RING_ODBC_FLAG_DBC ) { SQLFreeHandle(SQL_HANDLE_DBC,pODBC->dbc); } SQLAllocHandle(SQL_HANDLE_DBC, pODBC->env , &pODBC->dbc); pODBC->nFlag = pODBC->nFlag | RING_ODBC_FLAG_DBC ; ret = SQLDriverConnect(pODBC->dbc,NULL,(SQLCHAR *) RING_API_GETSTRING(2),SQL_NTS,outstr, sizeof(outstr), &outstrlen,SQL_DRIVER_COMPLETE); if ( SQL_SUCCEEDED(ret) ) { RING_API_RETNUMBER(1); } else { RING_API_RETNUMBER(0); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_sqlite_execute ( void *pPointer ) { ring_sqlite *psqlite ; int rc ; List *pList ; char *ErrMsg ; ErrMsg = NULL ; if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_MISS2PARA); return ; } if ( RING_API_ISPOINTER(1) && RING_API_ISSTRING(2) ) { psqlite = (ring_sqlite *) RING_API_GETCPOINTER(1,RING_VM_POINTER_SQLITE) ; if ( psqlite == NULL ) { return ; } if ( psqlite->db ) { pList = RING_API_NEWLIST ; rc = sqlite3_exec(psqlite->db,RING_API_GETSTRING(2),ring_vm_sqlite_callback,(void *) pList,&ErrMsg); RING_API_RETLIST(pList); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_refmeta_isprivatemethod ( void *pPointer ) { List *pList ; int x ; char *cStr ; if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_MISS2PARA); return ; } if ( RING_API_ISLIST(1) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) == 0 ) { RING_API_ERROR(RING_API_BADPARATYPE); return ; } if ( RING_API_ISSTRING(2) ) { cStr = RING_API_GETSTRING(2) ; ring_string_lower(cStr); x = ring_vm_oop_ismethod((VM *) pPointer,pList,cStr) ; if ( x==2 ) { RING_API_RETNUMBER(1); } else { RING_API_RETNUMBER(0); } } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_refmeta_isprivateattribute ( void *pPointer ) { List *pList ; int x ; char *cStr ; if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISLIST(1) && RING_API_ISSTRING(2) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) ) { cStr = RING_API_GETSTRING(2) ; ring_string_lower(cStr); pList = ring_list_getlist(pList,RING_OBJECT_OBJECTDATA); for ( x = 3 ; x <= ring_list_getsize(pList) ; x++ ) { if ( strcmp(cStr,ring_list_getstring(ring_list_getlist(pList,x),RING_VAR_NAME))==0 ) { if ( ring_list_getint(ring_list_getlist(pList,x),RING_VAR_PRIVATEFLAG) == 1 ) { RING_API_RETNUMBER(1); } else { RING_API_RETNUMBER(0); } return ; } } RING_API_RETNUMBER(0); } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_murmurhash3_x64_128(void *pPointer) { char *key = NULL; int keylen; int seed = 0; uint64_t out[2]; int ret_type = 0; List *tmp_list, *ret_val; if (RING_API_PARACOUNT < 2 || RING_API_PARACOUNT > 3) { RING_API_ERROR(RING_API_MISS2PARA); return ; } if (!RING_API_ISSTRING(1)) { RING_API_ERROR("murmurhash3_x64_128 expects the first parameter to be a string"); return; } if (!RING_API_ISNUMBER(2)) { RING_API_ERROR("murmurhash3_x64_128 expects the first parameter to be an integer"); return; } key = RING_API_GETSTRING(1); keylen = strlen(key); seed = RING_API_GETNUMBER(2); if (RING_API_PARACOUNT == 3) { if (RING_API_ISNUMBER(3)) { ret_type = RING_API_GETNUMBER(3); if (!is_bool(ret_type)) { RING_API_ERROR("Third parameter should be boolean value\n"); } } else { RING_API_ERROR("murmurhash3_x64_128 expects the third parameter to be an integer\n"); } } MurmurHash3_x64_128(key, keylen, seed, out); ret_val = RING_API_NEWLIST; tmp_list = ring_list_newlist_gc(((VM *)pPointer)->pRingState, ret_val); for (int i = 0; i < 2; i++) { if (ret_type) { char tmp[50]; LONG2HEX(tmp, out[i]); ring_list_addstring2(tmp_list, (char*) tmp, strlen((char *) tmp)); } else { ring_list_addint(tmp_list, out[i]); } } RING_API_RETLIST(ret_val); }
void ring_vm_refmeta_addmethod ( void *pPointer ) { List *pList, *pList2, *pList3 ; char *cStr ; int x ; VM *pVM ; /* Parameters : Object, MethodName, Anonymous Function */ pVM = (VM *) pPointer ; if ( RING_API_PARACOUNT != 3 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISLIST(1) && RING_API_ISSTRING(2) && RING_API_ISSTRING(3) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) ) { pList = (List *) ring_list_getlist(pList,RING_OBJECT_CLASSPOINTER); pList = (List *) ring_list_getlist(pList,RING_CLASSMAP_METHODSLIST); cStr = RING_API_GETSTRING(3); ring_string_lower(cStr); for ( x = 1 ; x <= ring_list_getsize(pVM->pFunctionsMap) ; x++ ) { pList2 = ring_list_getlist(pVM->pFunctionsMap,x); if ( strcmp(ring_list_getstring(pList2,RING_FUNCMAP_NAME),cStr) == 0 ) { /* Add new list to the class methods list */ pList3 = ring_list_newlist(pList); /* Copy function to class methods */ ring_list_copy(pList3,pList2); /* Set the Function Name */ ring_list_setstring(pList3,RING_FUNCMAP_NAME,ring_string_lower(RING_API_GETSTRING(2))); /* Refresh the HashTable */ ring_list_genhashtable2(pList); RING_API_RETNUMBER(1); return ; } } } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } RING_API_RETNUMBER(0); }
void ring_vm_refmeta_setattribute ( void *pPointer ) { List *pList ; char *cStr ; int x ; if ( RING_API_PARACOUNT != 3 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISLIST(1) && RING_API_ISSTRING(2) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) ) { pList = ring_list_getlist(pList,RING_OBJECT_OBJECTDATA); cStr = RING_API_GETSTRING(2) ; ring_string_lower(cStr); for ( x = 1 ; x <= ring_list_getsize(pList) ; x++ ) { if ( strcmp(ring_list_getstring(ring_list_getlist(pList,x),RING_VAR_NAME),cStr) == 0 ) { pList = ring_list_getlist(pList,x) ; if ( RING_API_ISNUMBER(3) ) { ring_list_setdouble(pList,RING_VAR_VALUE,RING_API_GETNUMBER(3)); } else if ( RING_API_ISSTRING(3) ) { ring_list_setstring2(pList,RING_VAR_VALUE,RING_API_GETSTRING(3),RING_API_GETSTRINGSIZE(3)); } else if ( RING_API_ISLIST(3) ) { ring_list_setlist(pList,RING_VAR_VALUE); pList = ring_list_getlist(pList,RING_VAR_VALUE); ring_list_deleteallitems(pList); ring_list_copy(pList,RING_API_GETLIST(3)); } return ; } } RING_API_ERROR("Error : Property is not found!"); } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_sqlite_open ( void *pPointer ) { ring_sqlite *psqlite ; int rc ; if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_MISS2PARA); return ; } if ( RING_API_ISPOINTER(1) && RING_API_ISSTRING(2) ) { psqlite = (ring_sqlite *) RING_API_GETCPOINTER(1,RING_VM_POINTER_SQLITE) ; if ( psqlite == NULL ) { return ; } rc = sqlite3_open(RING_API_GETSTRING(2),&psqlite->db); RING_API_RETNUMBER((double) rc); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_murmurhash1_aligned(void *pPointer) { char *key = NULL; int keylen; int seed = 0; uint32_t out; int ret_type = 0; if (RING_API_PARACOUNT < 2 || RING_API_PARACOUNT > 3) { RING_API_ERROR(RING_API_MISS2PARA); return ; } if (!RING_API_ISSTRING(1)) { RING_API_ERROR("murmurhash1_aligned expects the first parameter to be a string"); return; } if (!RING_API_ISNUMBER(2)) { RING_API_ERROR("murmurhash1_aligned expects the first parameter to be an integer"); return; } key = RING_API_GETSTRING(1); keylen = strlen(key); seed = RING_API_GETNUMBER(2); if (RING_API_PARACOUNT == 3) { if (RING_API_ISNUMBER(3)) { ret_type = RING_API_GETNUMBER(3); if (!is_bool(ret_type)) { RING_API_ERROR("Third parameter should be boolean value\n"); } } else { RING_API_ERROR("murmurhash1_aligned expects the third parameter to be an integer\n"); } } out = MurmurHash1Aligned(key, keylen, seed); MH_RETURN_INT(out, ret_type); }
void ring_vm_refmeta_addattribute ( void *pPointer ) { List *pList, *pList2 ; char *cStr ; int x ; if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISLIST(1) ) { pList = RING_API_GETLIST(1) ; if ( ring_vm_oop_isobject(pList) ) { pList = ring_list_getlist(pList,RING_OBJECT_OBJECTDATA); if ( RING_API_ISSTRING(2) ) { cStr = RING_API_GETSTRING(2) ; ring_string_lower(cStr); /* Create Variable List */ ring_vm_newvar2(cStr,pList); } else if ( RING_API_ISLIST(2) ) { pList2 = RING_API_GETLIST(2) ; for ( x = 1 ; x <= ring_list_getsize(pList2) ; x++ ) { if ( ring_list_isstring(pList2,x) ) { cStr = ring_list_getstring(pList2,x); ring_string_lower(cStr); /* Create Variable List */ ring_vm_newvar2(cStr,pList); } } } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_refmeta_mergemethods ( void *pPointer ) { int x ; List *pList, *pList2, *pList3 ; VM *pVM ; char *cStr, *cStr2 ; /* ** We copy class methods from class to another class ** First Parameter = Dest Class Name, Second Para = Source Class Name ** The Source Class is expected to be without Parent Class and Without Attributes */ if ( RING_API_PARACOUNT != 2 ) { RING_API_ERROR(RING_API_BADPARACOUNT); return ; } if ( RING_API_ISSTRING(1) && RING_API_ISSTRING(2) ) { cStr = RING_API_GETSTRING(1) ; cStr2 = RING_API_GETSTRING(2) ; ring_string_lower(cStr); ring_string_lower(cStr2); pVM = (VM *) pPointer ; /* Get the Dest Class Methods List */ pList2 = NULL ; for ( x = 1 ; x <= ring_list_getsize(pVM->pClassesMap) ; x++ ) { pList = ring_list_getlist(pVM->pClassesMap,x) ; if ( strcmp(ring_list_getstring(pList,RING_CLASSMAP_CLASSNAME),cStr) == 0 ) { /* Check if the class is imported from a Package */ if ( ring_list_getsize(pList) == RING_CLASSMAP_IMPORTEDCLASSSIZE ) { pList = ring_list_getlist(pList,RING_CLASSMAP_POINTERTOLISTOFCLASSINSIDEPACKAGE); } pList2 = ring_list_getlist(pList,RING_CLASSMAP_METHODSLIST) ; break ; } } if ( pList2 == NULL ) { RING_API_ERROR("Error, Can't find the dest class!"); return ; } /* Get the Source Class Methods List */ pList3 = NULL ; for ( x = 1 ; x <= ring_list_getsize(pVM->pClassesMap) ; x++ ) { pList = ring_list_getlist(pVM->pClassesMap,x) ; if ( strcmp(ring_list_getstring(pList,RING_CLASSMAP_CLASSNAME),cStr2) == 0 ) { /* Check if the class is imported from a Package */ if ( ring_list_getsize(pList) == RING_CLASSMAP_IMPORTEDCLASSSIZE ) { pList = ring_list_getlist(pList,RING_CLASSMAP_POINTERTOLISTOFCLASSINSIDEPACKAGE); } pList3 = ring_list_getlist(pList,RING_CLASSMAP_METHODSLIST) ; break ; } } if ( pList3 == NULL ) { RING_API_ERROR("Error, Can't find the source class!"); return ; } /* Copy Methods from Source to Dest */ ring_list_copy(pList2,pList3); } else { RING_API_ERROR(RING_API_BADPARATYPE); } }
void ring_vm_os_chdir ( void *pPointer ) { ring_chdir(RING_API_GETSTRING(1)); }