--- parser3/src/classes/string.C 2001/09/30 09:56:43 1.76 +++ parser3/src/classes/string.C 2001/10/17 15:44:47 1.83 @@ -4,7 +4,7 @@ Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - $Id: string.C,v 1.76 2001/09/30 09:56:43 parser Exp $ + $Id: string.C,v 1.83 2001/10/17 15:44:47 parser Exp $ */ #include "classes.h" @@ -43,15 +43,17 @@ static void _int(Request& r, const Strin Pool& pool=r.pool(); bool convert_problem=false; Exception rethrow_me; int converted; + Value *default_code=params->size()>0? + default_code=¶ms->as_junction(0, "default must be int"):0; // (default) PTRY { converted=r.self->as_int(); } PCATCH(e) { // convert problem - if(convert_problem=params->size()==0) { // we have a problem when do not have default + if(convert_problem=!default_code) { // we have a problem when no default rethrow_me=e; converted=0; } else - converted=params->as_int(0, r); // (default) + converted=r.process(*default_code).as_int(); } PEND_CATCH if(convert_problem) @@ -68,15 +70,17 @@ static void _double(Request& r, const St Pool& pool=r.pool(); bool convert_problem=false; Exception rethrow_me; double converted; + Value *default_code=params->size()>0? + default_code=¶ms->as_junction(0, "default must be double"):0; // (default) PTRY { converted=r.self->as_double(); } PCATCH(e) { // convert problem - if(convert_problem=params->size()==0) { // we have a problem when do not have default + if(convert_problem=!default_code) { // we have a problem when no default rethrow_me=e; converted=0; } else - converted=params->as_double(0, r); // (default) + converted=r.process(*default_code).as_double(); } PEND_CATCH if(convert_problem) @@ -107,7 +111,7 @@ static void _double(Request& r, const St static void _left(Request& r, const String&, MethodParams *params) { Pool& pool=r.pool(); - size_t n=(size_t)r.process(params->get(0)).as_double(); + size_t n=(size_t)params->as_int(0, "n must be int", r); const String& string=*static_cast(r.self)->get_string(); r.write_assign_lang(*new(pool) VString(string.mid(0, n))); @@ -116,7 +120,7 @@ static void _left(Request& r, const Stri static void _right(Request& r, const String&, MethodParams *params) { Pool& pool=r.pool(); - size_t n=(size_t)r.process(params->get(0)).as_double(); + size_t n=(size_t)params->as_int(0, "n must be int", r); const String& string=*static_cast(r.self)->get_string(); r.write_assign_lang(*new(pool) VString(string.mid(string.size()-n, string.size()))); @@ -125,10 +129,12 @@ static void _right(Request& r, const Str static void _mid(Request& r, const String&, MethodParams *params) { Pool& pool=r.pool(); - size_t p=(size_t)r.process(params->get(0)).as_double(); - size_t n=(size_t)r.process(params->get(1)).as_double(); - const String& string=*static_cast(r.self)->get_string(); + + size_t p=(size_t)params->as_int(0, "p must be int", r); + size_t n=params->size()>1? + (size_t)params->as_int(1, "n must be int", r):string.size(); + r.write_assign_lang(*new(pool) VString(string.mid(p, p+n))); } @@ -343,7 +349,7 @@ public: }; #endif const String* sql_result_string(Request& r, const String& method_name, MethodParams *params, - Hash *&options) { + Hash *& options, Value *& default_code) { Pool& pool=r.pool(); if(!r.connection) @@ -355,6 +361,7 @@ const String* sql_result_string(Request& ulong limit=0; ulong offset=0; + default_code=0; if(params->size()>1) { Value& voptions=params->as_no_junction(1, "options must be hash, not code"); if(voptions.is_defined()) @@ -363,6 +370,12 @@ const String* sql_result_string(Request& limit=(ulong)r.process(*vlimit).as_double(); if(Value *voffset=(Value *)options->get(*sql_offset_name)) offset=(ulong)r.process(*voffset).as_double(); + if(default_code=(Value *)options->get(*sql_default_name)) { + if(!default_code->get_junction()) + PTHROW(0, 0, + &method_name, + "default option must be code"); + } } else PTHROW(0, 0, &method_name, @@ -400,25 +413,17 @@ static void _sql(Request& r, const Strin Pool& pool=r.pool(); Hash *options; - const String *string=sql_result_string(r, method_name, params, options); + Value *default_code; + const String *string=sql_result_string(r, method_name, params, options, default_code); if(!string) { - if(options) { - if(Value *vdefault=(Value *)options->get(*sql_default_name)) { - if(!vdefault->get_junction()) - PTHROW(0, 0, - &method_name, - "default option must be code"); - string=r.process(*vdefault).get_string(); - if(!string) - string=empty_string; - } else - PTHROW(0, 0, - &method_name, - "produced no result, but no default option specified"); + if(default_code) { + string=r.process(*default_code).get_string(); + if(!string) + string=new(pool) String(pool); } else PTHROW(0, 0, &method_name, - "produced no result, but no options (no default) specified"); + "produced no result, but no default option specified"); } VString& result=*new(pool) VString(*string); result.set_name(method_name); @@ -438,6 +443,19 @@ static void _replace(Request& r, const S Dictionary dict(*table); r.write_assign_lang(*new(pool) VString(src.replace(pool, dict))); } + +static void _save(Request& r, const String& method_name, MethodParams *params) { + Pool& pool=r.pool(); + Value& vfile_name=params->as_no_junction(0, + "file name must not be code"); + + const String& src=*static_cast(r.self)->get_string(); + + // write + file_write(pool, r.absolute(vfile_name.as_string()), + src.cstr(String::UL_AS_IS), src.size(), true); +} + // constructor MString::MString(Pool& apool) : Methoded(apool) { @@ -462,7 +480,7 @@ MString::MString(Pool& apool) : Methoded // ^string.right(n) add_native_method("right", Method::CT_DYNAMIC, _right, 1, 1); // ^string.mid(p;n) - add_native_method("mid", Method::CT_DYNAMIC, _mid, 2, 2); + add_native_method("mid", Method::CT_DYNAMIC, _mid, 1, 2); // ^string.pos[substr] add_native_method("pos", Method::CT_DYNAMIC, _pos, 1, 1); @@ -487,6 +505,9 @@ MString::MString(Pool& apool) : Methoded // ^string.replace[table] add_native_method("replace", Method::CT_DYNAMIC, _replace, 1, 1); + + // ^string.save[file] + add_native_method("save", Method::CT_DYNAMIC, _save, 1, 1); } // global variable