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); }
int ring_objfile_readfile ( const char *cFileName,RingState *pRingState ) { FILE *fObj; signed char c ; List *pListFunctions, *pListClasses, *pListPackages, *pListCode, *pList, *pListStack ; int nActiveList,nValue,nBraceEnd ; double dValue ; char *cString ; char cKey[11] ; char cFileType[100] ; strcpy(cKey,"ringstring"); /* Create Lists */ pListFunctions = ring_list_new(0); pListClasses = ring_list_new(0); pListPackages = ring_list_new(0); pListCode = ring_list_new(0); pListStack = ring_list_new(0); pList = NULL ; /* Set Active List (1=functions 2=classes 3=packages 4=code) */ nActiveList = 0 ; nBraceEnd = 0 ; /* Open File */ fObj = fopen(cFileName , "rb" ); if ( fObj==NULL ) { printf( "Can't open file %s \n ",cFileName ) ; return 0 ; } fread( cFileType , 1 , 18 , fObj ); cFileType[18] = '\0' ; if ( strcmp(cFileType,"# Ring Object File") != 0 ) { printf( "The file type is not correct - the VM expect a ring object file\n" ) ; return 0 ; } c = getc(fObj); fread( cFileType , 1 , 13 , fObj ); cFileType[13] = '\0' ; if ( strcmp(cFileType,"# Version 1.1") != 0 ) { printf( "The file version is not correct - the VM expect a ring object file version 1.1\n" ) ; return 0 ; } /* Process File */ c = getc(fObj); while ( c != EOF ) { /* Check Char */ switch ( c ) { case '#' : /* Read Line */ while ( c != '\n' ) { c = getc(fObj); #ifdef DEBUG_OBJFILE printf( "%c ",c ) ; #endif } #ifdef DEBUG_OBJFILE puts("Read Comment ! "); #endif break ; case '{' : nActiveList++ ; switch ( nActiveList ) { case 1 : pList = pListFunctions ; break ; case 2 : pList = pListClasses ; break ; case 3 : pList = pListPackages ; break ; case 4 : pList = pListCode ; break ; } break ; case '[' : c = getc(fObj); switch ( c ) { case 'S' : c = getc(fObj); fscanf( fObj , "[%d]" , &nValue ) ; cString = (char *) malloc(nValue+1) ; fread( cString , 1 , nValue , fObj ); cString[nValue] = '\0' ; /* Decrypt String */ ring_objfile_xorstring(cString,nValue,cKey,10); ring_list_addstring2(pList,cString,nValue); free( cString ) ; #ifdef DEBUG_OBJFILE printf( "Read String %s Size %d \n",cString,nValue ) ; #endif break ; case 'I' : c = getc(fObj); fscanf( fObj , "%d" , &nValue ) ; ring_list_addint(pList,nValue); #ifdef DEBUG_OBJFILE printf( "Read Number %d \n ",nValue ) ; #endif break ; case 'D' : c = getc(fObj); fscanf( fObj , "%lf" , &dValue ) ; ring_list_adddouble(pList,dValue); #ifdef DEBUG_OBJFILE printf( "Read Double %d \n",dValue ) ; #endif break ; case 'P' : ring_list_addpointer(pList,NULL); /* Read Line */ while ( c != '\n' ) { c = getc(fObj); } #ifdef DEBUG_OBJFILE puts("Read Pointer "); #endif break ; case 'T' : ring_list_addpointer(pListStack,pList); pList = ring_list_newlist(pList); /* Read Line */ while ( c != '\n' ) { c = getc(fObj); } #ifdef DEBUG_OBJFILE puts("Read T "); #endif break ; case 'E' : pList = (List *) ring_list_getpointer(pListStack,ring_list_getsize(pListStack)) ; ring_list_deletelastitem(pListStack); /* Read Line */ while ( c != '\n' ) { c = getc(fObj); } #ifdef DEBUG_OBJFILE puts("Read E "); #endif break ; case 'L' : /* Read Until { */ while ( c != '{' ) { c = getc(fObj); } ring_list_addpointer(pListStack,pList); pList = ring_list_newlist(pList); nBraceEnd = 1 ; #ifdef DEBUG_OBJFILE puts("Read L "); #endif break ; } break ; case '}' : if ( nBraceEnd ) { pList = (List *) ring_list_getpointer(pListStack,ring_list_getsize(pListStack)) ; ring_list_deletelastitem(pListStack); nBraceEnd = 0 ; #ifdef DEBUG_OBJFILE puts("Read } "); #endif } break ; } c = getc(fObj); } /* Close File */ fclose( fObj ) ; ring_list_delete(pListStack); /* Update Ring State */ #ifdef DEBUG_OBJFILE puts("Old Code List "); ring_list_print(pRingState->pRingGenCode); #endif /* Update Lists */ pRingState->pRingFunctionsMap = pListFunctions ; pRingState->pRingClassesMap = pListClasses ; pRingState->pRingPackagesMap = pListPackages ; pRingState->pRingGenCode = pListCode ; #ifdef DEBUG_OBJFILE puts("Update Done! "); puts("New Code List "); ring_list_print(pRingState->pRingGenCode); #endif /* Update Classes Pointers */ ring_objfile_updateclassespointers(pRingState); return 1 ; }