All pastes #359742 Raw Edit

SProps

public text v1 · immutable
·published 2007-02-17 01:05 UTC
rendered paste body
//S:Props 0.2 By Sacky

#if defined _sprops_include
	#endinput
#else
	#define _sprops_include
#endif

#pragma library sprops

#if !defined GetArgString
	#define GetArgString(%1,%2) for(new x=0;getarg(%1,x)!='\0';x++) %2[x] = getarg(%1,x)
#endif

#if !defined GetArgType
	#define TYPE_STR 1
	#define TYPE_FLO 2
	#define TYPE_INT 3
	#define GetArgType(%1,%2) if(getarg(%1,0) > 0) %2 = TYPE_STR; else if(Float:getarg(%1) == floatstr(strfloat(Float:getarg(%1)))) %2 = TYPE_FLO; else %2 = TYPE_INT
#endif

#if !defined strfloat
	stock strfloat(Float:value){
		new str[64];
		format(str,sizeof(str),"%f",value);
		return str;
	}
#endif

stock SetProperty({Float,_}:...){
	new num = numargs();
	new totalstr[256];
	for(new i=0;i<num-1;i++){
		new semistr[64];
		GetArgString(i,semistr);
		if(!strlen(totalstr)) format(totalstr,sizeof(totalstr),"%s",semistr);
		else format(totalstr,sizeof(totalstr),"%s - %s",totalstr,semistr);
	}
	new type,input[256];
	GetArgType(num-1,type);
	switch(type){
		case TYPE_STR: GetArgString(num-1,inpaut);
		case TYPE_FLO: format(input,sizeof(input),"%f",Float:getarg(num-1));
		case TYPE_INT: format(input,sizeof(input),"%d",getarg(num-1));
	}
	setproperty(0,"",checksum(totalstr),input);
}

stock GetProperty({Float,_}:...){
	new num = numargs();
	new totalstr[256];
	for(new i=0;i<num;i++){
		new semistr[128];
		GetArgString(i,semistr);
		if(!strlen(totalstr)) format(totalstr,sizeof(totalstr),"%s",semistr);
		else format(totalstr,sizeof(totalstr),"%s - %s",totalstr,semistr);
	}
	printf("totalstr = %s",totalstr);
	new retstr[255];
	if(existproperty(0,"",checksum(totalstr))){
		getproperty(0,"",checksum(totalstr),retstr);
		strunpack(retstr,retstr);
	}
	else printf("Property Does not exist: %s",totalstr);
	return retstr;
}

stock IntProperty({Float,_}:...){
	new num = numargs();
	new totalstr[256];
	for(new i=0;i<num;i++){
		new semistr[64];
		GetArgString(i,semistr);
		if(!strlen(totalstr)) format(totalstr,sizeof(totalstr),"%s",semistr);
		else format(totalstr,sizeof(totalstr),"%s - %s",totalstr,semistr);
	}
	return strval(GetProperty(totalstr));
}

stock Float:FloatProperty({Float,_}:...){
	new num = numargs();
	new totalstr[256];
	for(new i=0;i<num;i++){
		new semistr[64];
		GetArgString(i,semistr);
		if(!strlen(totalstr)) format(totalstr,sizeof(totalstr),"%s",semistr);
		else format(totalstr,sizeof(totalstr),"%s - %s",totalstr,semistr);
	}
	return floatstr(GetProperty(totalstr));
}

stock bool:BoolProperty({Float,_}:...){
	new num = numargs();
	new totalstr[256];
	for(new i=0;i<num;i++){
		new semistr[64];
		GetArgString(i,semistr);
		if(!strlen(totalstr)) format(totalstr,sizeof(totalstr),"%s",semistr);
		else format(totalstr,sizeof(totalstr),"%s - %s",totalstr,semistr);
	}
	return bool:strval(GetProperty(totalstr));
}

stock checksum(buffer[],mod = 65521){ //based on Yoms Hash
	new a = 0,b = 1,c = 2,d = 3;
    for(new i=0,j=strlen(buffer);i<j;i++){
        a = ((a + buffer[i]) % mod);
        b = ((a + b)	     % mod);
        c = ((a + b + c)     % mod);
        d = ((a + b + c + d) % mod);
    }
    return ((d << 16) + (a + b + c));
}

//For testing

#include <a_samp>
#include <sprops>

main(){
	print("\n");
	SetProperty("This","Is","A","Test","String Test");
	printf("%s - 1",GetProperty("This","Is","A","Test"));
	SetProperty("This","Is","A","Test2",1098.87);
	printf("%f - 2",FloatProperty("This","Is","A","Test2"));
	SetProperty("This","Is","A","Test3",1847535);
	printf("%d - 3",IntProperty("This","Is","A","Test3"));
	SetProperty("This","Is","A","Test4",true);
	printf("%d - 4",BoolProperty("This","Is","A","Test4"));
}

public OnGameModeInit() return 1;