Пример #1
0
tType *Types_Register(const tType *Type)
{
	DEBUG("(Type=%p)", Type);
	DEBUG_NL("Type=");
	IF_DEBUG( Types_Print(stdout, Type) );
	DEBUG_S("\n");
	tType **retp = bsearch(&Type, gpTypeCache, giTypeCacheSize, sizeof(void*), Types_Compare_I);
	if(retp) {
		assert(*retp);
		DEBUG("RETURN %p (cached)", *retp);
		return *retp;
	}
	
	gpTypeCache = realloc(gpTypeCache, (giTypeCacheSize+1)*sizeof(void*));
	assert(gpTypeCache);
	tType *ret = malloc( sizeof(tType) );
	*ret = *Type;
	gpTypeCache[giTypeCacheSize] = ret;
	giTypeCacheSize ++;

	qsort(gpTypeCache, giTypeCacheSize, sizeof(void*), Types_Compare_I);

	DEBUG("RETURN %p (new)", ret);
	return ret;
}
Пример #2
0
int Types_RegisterTypedef(const char *Name, size_t NameLen, const tType *Type)
{
	DEBUG_NL("(Name=%.*s, Type=", (int)NameLen, Name);
	IF_DEBUG( Types_Print(stdout, Type) );
	DEBUG_S(")\n");
	tTypedef **pnp = &gpTypedefs;
	for( tTypedef *td = gpTypedefs; td; pnp = &td->Next, td = td->Next )
	{
		int cmp = strncmp(td->Name, Name, NameLen);
		if( cmp > 0 )
			break;
		if( cmp == 0 && strlen(td->Name) == NameLen )
		{
			if( Types_Compare(td->Base, Type) != 0 ) {
				// Error! Incompatible redefinition
				return -1;
			}
			// Compatible redefinition
			return 1;
		}
	}
	
	tTypedef *td = malloc( sizeof(tTypedef) + NameLen + 1 );
	td->Name = (char*)(td + 1);
	memcpy(td+1, Name, NameLen);
	((char*)(td+1))[NameLen] = 0;
	td->Base = Type;
	
	td->Next = *pnp;
	*pnp = td;
	
	return 0;
}
Пример #3
0
int mongoproxy_session_select_backend(mongoproxy_session_t * sess, int primary)
{
    mongo_replset_t *replset = &(g_server.replset);
    if (sess->backend_conn) {   //already got a connection
        if (sess->backend_conn->backend == replset->primary) {
            return 0;
        } else {                //my conn is not to primary
            if (primary) {
                mongo_replset_release_conn(sess->backend_conn);
                sess->backend_conn = NULL;
            } else {
                return 0;
            }
        }
    }
    DEBUG_S("we will use a new backend_conn, [primary:%d]", primary);

    sess->backend_conn = mongo_replset_get_conn(replset, primary);
    if (!sess->backend_conn) {
        ERROR_S("get no connection");
        return -1;
    }

    return 0;
}
Пример #4
0
static VALUE RUDL_at_exit(VALUE obj)
{
    DEBUG_S("Reached RUDL_at_exit");
#ifdef HAVE_SDL_NET_H
    quitNet();
#endif
    quitJoystick();
#ifdef HAVE_SDL_MIXER_H
    quitAudio();
#endif
    quitVideo();
    quitTTF();

    DEBUG_S("Quitting the rest of it");
    SDL_Quit();
    return Qnil;
}
Пример #5
0
mongoproxy_session_t *mongoproxy_session_new()
{
    mongoproxy_session_t *sess;

    sess = malloc(sizeof(*sess));
    if (!sess) {
        ERROR("error on malloc");
        return NULL;
    }
    memset(sess, 0, sizeof(*sess));


    sess->proxy_state = SESSION_STATE_UNSET;
    sess->buf = buffer_new(MONGOPROXY_DEFAULT_BUF_SIZE);
    sess->sessionid = random(); 
    sess->sessionid = sess->sessionid<<32 | random();

    DEBUG_S("proxy_session new : %p", sess);
    return sess;
}
Пример #6
0
static VALUE rb_pit_cross_lines(VALUE self, VALUE pa, VALUE pb, VALUE pc, VALUE pd)
{
	double pax=array_get_x(pa);
	double pbx=array_get_x(pb);
	double pcx=array_get_x(pc);
	double pdx=array_get_x(pd);
	double pay=array_get_y(pa);
	double pby=array_get_y(pb);
	double pcy=array_get_y(pc);
	double pdy=array_get_y(pd);
	double xk, yk, a, b, c, d;

	double tmp;

	if(pax!=pbx && pcx!=pdx){	// check eerst even of geen van de lijnen vertikaal is
		// De lijnpunten sorteren op x-coordinaat.
		if(pax>pbx){
			tmp=pax; pax=pbx; pbx=tmp;
			tmp=pay; pay=pby; pby=tmp;
		}
		if(pcx>pdx){
			tmp=pcx; pcx=pdx; pdx=tmp;
			tmp=pcy; pcy=pdy; pdy=tmp;
		}
		a=(pby-pay)/(pbx-pax);		// de helling van de eerste lijn
		b=pay-a*pax;				// het snijpunt van de eerste lijn met x=0

		c=(pdy-pcy)/(pdx-pcx);		// de helling van de tweede lijn
		d=pcy-c*pcx;				// het snijpunt van de tweede lijn met x=0

		if(a==c){	// Are they parallel?
			if(b==d){		// Are they the same line?
				if(!(pbx<pcx || pax>pdx)){	// Are the sections the same?
					// Calculate overlapping line section
					double cx1, cy1, cx2, cy2;
					DEBUG_S("overlap");
					if(pax<pcx){
						cx1=pcx;
						cy1=pcy;
					}else{
						cx1=pax;
						cy1=pay;
					}

					if(pbx<pdx){
						cx2=pbx;
						cy2=pby;
					}else{
						cx2=pdx;
						cy2=pdy;
					}

					return rb_pit_cross_lines_retval(true, true, cx1, cy1, cx2, cy2);
				}else{
					return Qfalse;
				}
			}
		}

		xk=(d-b)/(a-c);				// bereken de x-coordinaat van het snijpunt
		yk=a*xk+b;					// en de y-coordinaat

		// de lijnen snijden als de x-coordinaat van het snijpunt tussen
		// de begin- en eind-x-coordinaten van de lijnen ligt.
		return rb_pit_cross_lines_retval(xk<=pbx && xk>=pax && xk<=pdx && xk>=pcx, false, xk, yk, 0, 0);

	}else{ // wat als een van de lijnen vertikaal is?
		// De lijnpunten sorteren op y-coordinaat.
		if(pay>pby){
			tmp=pax; pax=pbx; pbx=tmp;
			tmp=pay; pay=pby; pby=tmp;
		}
		if(pcy>pdy){
			tmp=pcx; pcx=pdx; pdx=tmp;
			tmp=pcy; pcy=pdy; pdy=tmp;
		}

		if(pax==pbx){
			if(pcx==pdx){ // Beide lijnen lopen verticaal
				return rb_pit_cross_lines_retval((pax==pcx)&&!(pby<pcy || pay>pdy), true, pax, RUDL_MAX(pay, pcy), pax, RUDL_MIN(pby, pdy));
			}else{ // alleen de eerste lijn loopt vertikaal
				if((pcx<pax && pdx<pax)||(pcx>pax && pdx>pax)){
					return rb_pit_cross_lines_retval(false, false, 0,0,0,0);
				}
				c=(pdy-pcy)/(pdx-pcx);	// de helling van de tweede lijn berkenen
				d=pcy-c*pcx;			// het snijpunt van de tweede lijn met x=0 berekenen
				yk=c*pax+d;				// de y-coord van het snijpunt is dan
				return rb_pit_cross_lines_retval(yk>=pay && yk<=pby, false, pax, yk, 0, 0);
			}
		}else{ // Alleen de tweede lijn loopt verticaal
			if((pax<pcx && pbx<pcx)||(pax>pcx && pbx>pcx)){
				return rb_pit_cross_lines_retval(false, false, 0,0,0,0);
			}
			c=(pby-pay)/(pbx-pax);	// de helling van de eerste lijn berkenen
			d=pay-c*pax;			// het snijpunt van de tweede lijn met x=0 berekenen
			yk=c*pcx+d;				// de y-coord van het snijpunt is dan
			return rb_pit_cross_lines_retval(yk>=pcy && yk<=pdy, false, pcx, yk, 0, 0);
		}
	}
}
Пример #7
0
DECKLSPECKL void Init_RUDL()
{
    DEBUG_S("Init_RUDL()");

    moduleRUDL=rb_define_module("RUDL");

    rb_define_singleton_method(moduleRUDL, "at_exit", RUDL_at_exit, 0);
    rb_define_singleton_method(moduleRUDL, "init_subsystem", RUDL_init, 1);
    rb_define_singleton_method(moduleRUDL, "quit_subsystem", RUDL_quit, 1);
    rb_define_singleton_method(moduleRUDL, "is_subsystem_init", RUDL_is_init, 1);
    rb_define_singleton_method(moduleRUDL, "versions", RUDL_versions, 0);

/**
@class RUDL::SDLError
SDLError is the class that is thrown when SDL or RUDL find an SDL-specific
problem.
*/
    classSDLError=rb_define_class("SDLError", rb_eStandardError);

/**
@class RUDL::Pit
The @Pit is where the things end up that don't fit anywhere else.
The methods are documented where they fit best.
*/
    classPit=rb_define_class_under(moduleRUDL, "Pit", rb_cObject);

/**
@class RUDL::Version
@Version is the class used for version comparisons.
It defines four version levels: major, minor, patch and deepest.
*/
/**
@method initialize( major=0, minor=0, patch=0, deepest=0 )
Initializes a new Version object.
*/
/**
@method <( v )
Compares this version number with the one in @v.
Returns <code>true</code> if older.
*/
/**
@method to_s
Returns the version as a string: "major.minor.patch.deepest"
*/
    rb_eval_string(
        "module RUDL\n"
        "   class Version\n"
        "       attr_accessor :major, :minor, :patch, :deepest\n"
        "       def <(v)\n"
        "           (@major<v.major) or\n"
        "           (@major==v.major and @minor<v.minor) or\n"
        "           (@major==v.major and @minor==v.minor and @patch<v.patch) or\n"
        "           (@major==v.major and @minor==v.minor and @patch==v.patch and @deepest<v.deepest)\n"
        "       end\n"
        "       def initialize(major=0, minor=0, patch=0, deepest=0)\n"
        "           @major=major\n"
        "           @minor=minor\n"
        "           @patch=patch\n"
        "           @deepest=deepest\n"
        "       end\n"
        "       def to_s\n"
        "           \"#{major}.#{minor}.#{patch}.#{deepest}\"\n"
        "       end\n"
        "   end\n"
        "end\n"
    );

    id_begin=rb_intern("begin");
    id_end=rb_intern("end");
    id_new=rb_intern("new");
    id_clone=rb_intern("clone");

/**
@class RUDL::Constants
All for the hacked @init_subsystem and @quit_subsystem,
which should officially never be needed:
<code>INIT_TIMER, INIT_AUDIO, INIT_VIDEO, INIT_CDROM, INIT_JOYSTICK, INIT_NOPARACHUTE, INIT_EVERYTHING</code>
*/
    moduleConstant=rb_define_module_under(moduleRUDL, "Constant");
    DEC_CONST(INIT_TIMER);
    DEC_CONST(INIT_AUDIO);
    DEC_CONST(INIT_VIDEO);
    DEC_CONST(INIT_CDROM);
    DEC_CONST(INIT_JOYSTICK);
    DEC_CONST(INIT_NOPARACHUTE);
    DEC_CONST(INIT_EVERYTHING);

    initAudioClasses();
    initCDClasses();
    initEventsClasses();
    initTrueTypeFontClasses();
    initJoystickClasses();
    initKeyClasses();
    initMouseClasses();
    initTimerClasses();
    initVideoClasses();
    initSFontClasses();
    initFLXClasses();

    initNetClasses();
    initSDL();