patch #2911 - tp_getset for Lamp module.
A nice juicy chunk of new style attribute handling from Ken Hughes. Thanks, Ken.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -588,3 +588,172 @@ PyObject *EXPP_addScriptLink(ScriptLink *slink, PyObject *args, int is_scene)
|
||||
|
||||
return EXPP_incr_ret (Py_None); /* normal exit */
|
||||
}
|
||||
|
||||
/*
|
||||
* Utility routines to clamp and store various datatypes. The object type
|
||||
* is checked and a exception is raised if it's not the correct type.
|
||||
*
|
||||
* Inputs:
|
||||
* value: PyObject containing the new value
|
||||
* param: pointer to destination variable
|
||||
* max, min: range of values for clamping
|
||||
*
|
||||
* Return 0 on success, -1 on error.
|
||||
*/
|
||||
|
||||
int EXPP_setCharClamped ( PyObject *value, char *param,
|
||||
short min, short max )
|
||||
{
|
||||
/* if value not of correct type, raise Type exception */
|
||||
|
||||
if( !PyInt_CheckExact( value ) ) {
|
||||
char errstr[128];
|
||||
sprintf ( errstr, "expected char argument in [%d,%d]", min, max );
|
||||
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
|
||||
}
|
||||
|
||||
/* clamp and store value */
|
||||
|
||||
*param = EXPP_ClampInt( PyInt_AS_LONG ( value ), min, max );
|
||||
return 0;
|
||||
}
|
||||
|
||||
int EXPP_setShortClamped ( PyObject *value, short *param,
|
||||
short min, short max )
|
||||
{
|
||||
if( !PyInt_CheckExact ( value ) ) {
|
||||
char errstr[128];
|
||||
sprintf ( errstr, "expected int argument in [%d,%d]", min, max );
|
||||
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
|
||||
}
|
||||
|
||||
*param = EXPP_ClampInt( PyInt_AS_LONG ( value ), min, max );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int EXPP_setIntClamped ( PyObject *value, int *param,
|
||||
int min, int max )
|
||||
{
|
||||
if( !PyInt_CheckExact ( value ) ) {
|
||||
char errstr[128];
|
||||
sprintf ( errstr, "expected int argument in [%d,%d]", min, max );
|
||||
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
|
||||
}
|
||||
|
||||
*param = EXPP_ClampInt( PyInt_AS_LONG ( value ), min, max );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int EXPP_setFloatClamped ( PyObject *value, float *param,
|
||||
float min, float max )
|
||||
{
|
||||
if( !PyFloat_CheckExact ( value ) ) {
|
||||
char errstr[128];
|
||||
sprintf ( errstr, "expected float argument in [%f,%f]", min, max );
|
||||
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
|
||||
}
|
||||
|
||||
*param = EXPP_ClampFloat( PyFloat_AS_DOUBLE( value ), min, max );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Utility routines to range-check and store various datatypes. The object
|
||||
* type is checked and a exception is raised if it's not the correct type.
|
||||
* An exception is also raised if the value lies outside of the specified
|
||||
* range.
|
||||
*
|
||||
* Inputs:
|
||||
* value: PyObject containing the new value
|
||||
* param: pointer to destination variable
|
||||
* max, min: valid range for value
|
||||
*
|
||||
* Return 0 on success, -1 on error.
|
||||
*/
|
||||
|
||||
int EXPP_setCharRange ( PyObject *value, char *param,
|
||||
short min, short max )
|
||||
{
|
||||
char errstr[128];
|
||||
short number;
|
||||
|
||||
/* build exception error string */
|
||||
|
||||
sprintf ( errstr, "expected int argument in [%d,%d]", min, max );
|
||||
|
||||
/* if value not of correct type, raise Type exception */
|
||||
|
||||
if( !PyInt_CheckExact ( value ) )
|
||||
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
|
||||
|
||||
/* if value out of range, raise Value exception */
|
||||
|
||||
number = PyInt_AS_LONG ( value );
|
||||
if ( number < min || number > max )
|
||||
return EXPP_ReturnIntError( PyExc_ValueError, errstr );
|
||||
|
||||
/* store value */
|
||||
|
||||
*param = number;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int EXPP_setShortRange ( PyObject *value, short *param,
|
||||
short min, short max )
|
||||
{
|
||||
char errstr[128];
|
||||
short number;
|
||||
|
||||
sprintf ( errstr, "expected int argument in [%d,%d]", min, max );
|
||||
|
||||
if( !PyInt_CheckExact ( value ) )
|
||||
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
|
||||
|
||||
number = PyInt_AS_LONG ( value );
|
||||
if ( number < min || number > max )
|
||||
return EXPP_ReturnIntError( PyExc_ValueError, errstr );
|
||||
|
||||
*param = number;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int EXPP_setIntRange ( PyObject *value, int *param,
|
||||
int min, int max )
|
||||
{
|
||||
char errstr[128];
|
||||
int number;
|
||||
|
||||
sprintf ( errstr, "expected int argument in [%d,%d]", min, max );
|
||||
|
||||
if( !PyInt_CheckExact ( value ) )
|
||||
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
|
||||
|
||||
number = PyInt_AS_LONG ( value );
|
||||
if ( number < min || number > max )
|
||||
return EXPP_ReturnIntError( PyExc_ValueError, errstr );
|
||||
|
||||
*param = number;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int EXPP_setFloatRange ( PyObject *value, float *param,
|
||||
float min, float max )
|
||||
{
|
||||
char errstr[128];
|
||||
short number;
|
||||
|
||||
sprintf ( errstr, "expected int argument in [%f,%f]", min, max );
|
||||
|
||||
if( !PyFloat_CheckExact ( value ) )
|
||||
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
|
||||
|
||||
number = PyFloat_AS_DOUBLE( value );
|
||||
if ( number < min || number > max )
|
||||
return EXPP_ReturnIntError( PyExc_ValueError, errstr );
|
||||
|
||||
*param = number;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -97,6 +97,26 @@ int EXPP_map_getShortVal( const EXPP_map_pair * map,
|
||||
int EXPP_map_getStrVal( const EXPP_map_pair * map,
|
||||
int ival, const char **sval );
|
||||
|
||||
/* clamping and range-checking utilities */
|
||||
|
||||
int EXPP_setCharClamped ( PyObject *value, char *param,
|
||||
short min, short max);
|
||||
int EXPP_setShortClamped ( PyObject *value, short *param,
|
||||
short min, short max);
|
||||
int EXPP_setIntClamped ( PyObject *value, int *param,
|
||||
int min, int max);
|
||||
int EXPP_setFloatClamped ( PyObject *value, float *param,
|
||||
float min, float max);
|
||||
|
||||
int EXPP_setChrRange ( PyObject *value, char *param,
|
||||
short min, short max);
|
||||
int EXPP_setShortRange ( PyObject *value, short *param,
|
||||
short min, short max);
|
||||
int EXPP_setIntRange ( PyObject *value, int *param,
|
||||
int min, int max);
|
||||
int EXPP_setFloatRange ( PyObject *value, float *param,
|
||||
float min, float max);
|
||||
|
||||
/* scriplinks-related: */
|
||||
PyObject *EXPP_getScriptLinks(ScriptLink *slink, PyObject *args, int is_scene);
|
||||
PyObject *EXPP_addScriptLink(ScriptLink *slink, PyObject *args, int is_scene);
|
||||
@@ -106,3 +126,4 @@ PyObject *EXPP_clearScriptLinks(ScriptLink *slink, PyObject *args);
|
||||
void EXPP_allqueue(unsigned short event, short val);
|
||||
|
||||
#endif /* EXPP_gen_utils_h */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user