|
|
| version 1.24.2.2, 2003/01/31 12:34:27 | version 1.24.2.8, 2003/02/17 17:05:02 |
|---|---|
| Line 7 | Line 7 |
| static const char* IDENT_MATH_C="$Date$"; | static const char* IDENT_MATH_C="$Date$"; |
| #include "pa_vmethod_frame.h" | |
| #include "pa_common.h" | #include "pa_common.h" |
| #include "pa_vint.h" | #include "pa_vint.h" |
| #include "pa_vmath.h" | #include "pa_vmath.h" |
| Line 28 static const char* IDENT_MATH_C="$Date$" | Line 30 static const char* IDENT_MATH_C="$Date$" |
| // class | // class |
| class MMath : public Methoded { | class MMath: public Methoded { |
| public: | public: |
| MMath(Pool& pool); | MMath(); |
| void configure_admin(Request& r); | void configure_admin(Request& r); |
| public: // Methoded | public: // Methoded |
| bool used_directly() { return false; } | bool used_directly() { return false; } |
| }; | }; |
| // global variables | |
| MethodedPtr math_class(0); // fictive | |
| MethodedPtr math_base_class(new MMath); | |
| // methods | // methods |
| static unsigned int randomizer=0; | static unsigned int randomizer=0; |
| static inline int _random(uint top) { | static inline int _random(uint top) { |
| return (int)(((double)((randomizer=rand())% RAND_MAX)) / RAND_MAX * top ); | return (int)(((double)((randomizer=rand())% RAND_MAX)) / RAND_MAX * top ); |
| } | } |
| static void _random(Request& r, const String& method_name, MethodParams *params) { | static void _random(Request& r, StringPtr method_name, MethodParams& params) { |
| Pool& pool=r.pool(); | Pool& pool=r.pool(); |
| Value& range=params->as_junction(0, "range must be expression"); | ValuePtr range=params.as_junction(0, "range must be expression"); |
| double top=r.process_to_value(range).as_double(); | double top=r.process_to_value(range)->as_double(); |
| if(top<=1) | if(top<=1) |
| throw Exception("parser.runtime", | throw Exception("parser.runtime", |
| &method_name, | method_name, |
| "top must be above 1(%g)", top); | "top must be above 1(%g)", top); |
| r.write_no_lang(*new(pool) VInt(pool, _random(uint(top)))); | r.write_no_lang(ValuePtr(new VInt(_random(uint(top))))); |
| } | } |
| Line 62 static double degrees(double param) { re | Line 69 static double degrees(double param) { re |
| static double radians(double param) { return param /180 *PI; } | static double radians(double param) { return param /180 *PI; } |
| static void math1(Request& r, | static void math1(Request& r, |
| const String& method_name, MethodParams *params, | StringPtr method_name, MethodParams& params, |
| math1_func_ptr func) { | math1_func_ptr func) { |
| Pool& pool=r.pool(); | ValuePtr param=params.as_junction(0, "parameter must be expression"); |
| Value& param=params->as_junction(0, "parameter must be expression"); | |
| double result=(*func)(r.process_to_value(param).as_double()); | double result=func(r.process_to_value(param)->as_double()); |
| r.write_no_lang(*new(pool) VDouble(pool, result)); | r.write_no_lang(ValuePtr(new VDouble(result))); |
| } | } |
| #define MATH1(name) \ | #define MATH1(name) \ |
| static void _##name(Request& r, const String& method_name, MethodParams *params) {\ | static void _##name(Request& r, StringPtr method_name, MethodParams& params) {\ |
| math1(r, method_name, params, &name);\ | math1(r, method_name, params, &name);\ |
| } | } |
| #define MATH1P(name_parser, name_c) \ | #define MATH1P(name_parser, name_c) \ |
| static void _##name_parser(Request& r, const String& method_name, MethodParams *params) {\ | static void _##name_parser(Request& r, StringPtr method_name, MethodParams& params) {\ |
| math1(r, method_name, params, &name_c);\ | math1(r, method_name, params, &name_c);\ |
| } | } |
| MATH1(round); MATH1(floor); MATH1P(ceiling, ceil); | MATH1(round); MATH1(floor); MATH1P(ceiling, ceil); |
| Line 92 MATH1(sqrt); | Line 98 MATH1(sqrt); |
| typedef double (*math2_func_ptr)(double, double); | typedef double (*math2_func_ptr)(double, double); |
| static void math2(Request& r, | static void math2(Request& r, |
| const String& method_name, MethodParams *params, | StringPtr method_name, MethodParams& params, |
| math2_func_ptr func) { | math2_func_ptr func) { |
| Pool& pool=r.pool(); | ValuePtr a=params.as_junction(0, "parameter must be expression"); |
| Value& a=params->as_junction(0, "parameter must be expression"); | ValuePtr b=params.as_junction(1, "parameter must be expression"); |
| Value& b=params->as_junction(1, "parameter must be expression"); | |
| double result=(*func)( | double result=func( |
| r.process_to_value(a).as_double(), | r.process_to_value(a)->as_double(), |
| r.process_to_value(b).as_double()); | r.process_to_value(b)->as_double()); |
| r.write_no_lang(*new(pool) VDouble(pool, result)); | r.write_no_lang(ValuePtr(new VDouble(result))); |
| } | } |
| #define MATH2(name) \ | #define MATH2(name) \ |
| static void _##name(Request& r, const String& method_name, MethodParams *params) {\ | static void _##name(Request& r, StringPtr method_name, MethodParams& params) {\ |
| math2(r, method_name, params, &name);\ | math2(r, method_name, params, &name);\ |
| } | } |
| MATH2(pow); | MATH2(pow); |
| Line 125 static size_t calc_prefix_size(const cha | Line 130 static size_t calc_prefix_size(const cha |
| } else | } else |
| return 0; | return 0; |
| } | } |
| static void _crypt(Request& r, const String& method_name, MethodParams *params) { | static void _crypt(Request& r, StringPtr method_name, MethodParams& params) { |
| Pool& pool=r.pool(); | Pool& pool=r.pool(); |
| const char* password=params->as_string(0, "password must be string").cstr(); | CharPtr password=params.as_string(0, "password must be string")->cstr(); |
| const char* maybe_bodyless_salt=params->as_string(1, "salt must be string").cstr(); | CharPtr maybe_bodyless_salt=params.as_string(1, "salt must be string")->cstr(); |
| size_t prefix_size=calc_prefix_size(maybe_bodyless_salt); | size_t prefix_size=calc_prefix_size(maybe_bodyless_salt); |
| const char* normal_salt; | const char* normal_salt; |
| Line 150 static void _crypt(Request& r, const Str | Line 155 static void _crypt(Request& r, const Str |
| */ | */ |
| if(strncmp(normal_salt, PA_MD5PW_ID, PA_MD5PW_IDLEN) == 0) { | if(strncmp(normal_salt, PA_MD5PW_ID, PA_MD5PW_IDLEN) == 0) { |
| const size_t sample_size=120; | const size_t sample_size=120; |
| char *sample_buf=(char *)pool.malloc(sample_size); | char *sample_buf=new(pool) char[sample_size]; |
| pa_MD5Encode((const unsigned char *)password, | pa_MD5Encode((const unsigned char *)password.get(), |
| (const unsigned char *)normal_salt, sample_buf, sample_size); | (const unsigned char *)normal_salt, sample_buf, sample_size); |
| r.write_pass_lang(*new(pool) String(pool, sample_buf)); | String sample(sample_buf); |
| r.write_pass_lang(sample); | |
| } else { | } else { |
| #ifdef HAVE_CRYPT | #ifdef HAVE_CRYPT |
| const char* sample_buf=crypt(password, normal_salt); | const char* static_sample_buf=crypt(password, normal_salt); |
| if(!sample_buf // nothing generated | if(!static_sample_buf // nothing generated |
| || !sample_buf[0] // generated nothing | || !static_sample_buf[0] // generated nothing |
| || strncmp(sample_buf, normal_salt, prefix_size)!=0) // salt prefix not preserved | || strncmp(static_sample_buf, normal_salt, prefix_size)!=0) // salt prefix not preserved |
| throw Exception("parser.runtime", | throw Exception("parser.runtime", |
| &method_name, | method_name, |
| "on this platform does not support '%.*s' salt prefix", prefix_size, normal_salt); | "on this platform does not support '%.*s' salt prefix", prefix_size, normal_salt); |
| r.write_pass_lang(*new(pool) String(pool, sample_buf)); | r.write_pass_lang(StringPtr(new String(pool.copy(static_sample_buf)))); |
| #else | #else |
| throw Exception("parser.runtime", | throw Exception("parser.runtime", |
| &method_name, | method_name, |
| "salt must start with '" PA_MD5PW_ID "'"); | "salt must start with '" PA_MD5PW_ID "'"); |
| #endif | #endif |
| } | } |
| Line 175 static void _crypt(Request& r, const Str | Line 181 static void _crypt(Request& r, const Str |
| // constructor | // constructor |
| MMath::MMath(Pool& apool) : Methoded(apool, "math") { | MMath::MMath(): Methoded("math") { |
| // ^FUNC(expr) | // ^FUNC(expr) |
| #define ADD1(name) \ | #define ADD1(name) \ |
| add_native_method(#name, Method::CT_STATIC, _##name, 1, 1) | add_native_method(#name, Method::CT_STATIC, _##name, 1, 1) |
| Line 218 void MMath::configure_admin(Request&) { | Line 224 void MMath::configure_admin(Request&) { |
| if(!randomizer) | if(!randomizer) |
| randomizer=rand(); | randomizer=rand(); |
| } | } |
| // global variables | |
| VStateless_classPtr math_base_class(???); | |
| // creator | |
| Methoded *MMath_create(Pool& pool) { | |
| return math_base_class=new(pool) MMath(pool); | |
| } |