|
|
| version 1.49, 2009/07/24 09:29:15 | version 1.65, 2023/09/26 20:49:05 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: @b hashfile parser class. | Parser: @b hashfile parser class. |
| Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001-2023 Art. Lebedev Studio (http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) | Authors: Konstantin Morshnev <moko@design.ru>, Alexandr Petrosian <paf@design.ru> |
| */ | */ |
| static const char * const IDENT="$Id$"; | |
| #include "classes.h" | #include "classes.h" |
| #include "pa_request.h" | #include "pa_request.h" |
| Line 14 static const char * const IDENT="$Id$"; | Line 12 static const char * const IDENT="$Id$"; |
| #include "pa_vhashfile.h" | #include "pa_vhashfile.h" |
| #include "pa_vhash.h" | #include "pa_vhash.h" |
| volatile const char * IDENT_HASHFILE_C="$Id$"; | |
| // class | // class |
| class MHashfile : public Methoded { | class MHashfile : public Methoded { |
| public: // VStateless_class | public: // VStateless_class |
| Value *create_new_value(Pool& apool, HashStringValue*) { return new VHashfile(apool); } | Value *create_new_value(Pool& apool) { return new VHashfile(apool); } |
| public: | public: |
| MHashfile(); | MHashfile(); |
| public: // Methoded | |
| bool used_directly() { return true; } | |
| }; | }; |
| // global variable | // global variable |
| DECLARE_CLASS_VAR(hashfile, new MHashfile, 0); | DECLARE_CLASS_VAR(hashfile, new MHashfile); |
| // externs | |
| extern String cycle_data_name; | |
| // defines for statics | // defines for statics |
| Line 49 static void _open(Request& r, MethodPara | Line 42 static void _open(Request& r, MethodPara |
| r.classes_conf.put(OPEN_DATA_NAME, file_list); | r.classes_conf.put(OPEN_DATA_NAME, file_list); |
| } | } |
| const String& file_spec=r.absolute(params.as_string(0, FILE_NAME_MUST_BE_STRING)); | const String& file_spec=r.full_disk_path(params.as_string(0, FILE_NAME_MUST_BE_STRING)); |
| if(file_list->get(file_spec)) | if(file_list->get(file_spec)) |
| throw Exception(PARSER_RUNTIME, | throw Exception(PARSER_RUNTIME, |
| 0, | 0, |
| Line 65 static void _hash(Request& r, MethodPara | Line 58 static void _hash(Request& r, MethodPara |
| // write out result | // write out result |
| VHash& result=*new VHash(*self.get_hash()); | VHash& result=*new VHash(*self.get_hash()); |
| r.write_no_lang(result); | r.write(result); |
| } | } |
| static void _delete(Request& r, MethodParams& params) { | static void _delete(Request& r, MethodParams& params) { |
| Line 100 struct Foreach_info { | Line 93 struct Foreach_info { |
| }; | }; |
| #endif | #endif |
| static bool one_foreach_cycle( | static bool one_foreach_cycle( |
| const String::Body key, | const String::Body key, |
| const String& value, | const String& value, |
| void* ainfo) { | void* ainfo) { |
| Foreach_info& info=*static_cast<Foreach_info*>(ainfo); | Foreach_info& info=*static_cast<Foreach_info*>(ainfo); |
| if(info.key_var_name){ | if(info.key_var_name){ |
| VString* vkey=new VString(*new String(key, String::L_TAINTED)); | VString* vkey=new VString(*new String(key, String::L_TAINTED)); |
| info.var_context->put_element(*info.var_context, *info.key_var_name, vkey, false); | info.r->put_element(*info.var_context, *info.key_var_name, vkey); |
| } | } |
| if(info.value_var_name){ | if(info.value_var_name){ |
| VString* vvalue=new VString(value); | VString* vvalue=new VString(value); |
| info.var_context->put_element(*info.var_context, *info.value_var_name, vvalue, false); | info.r->put_element(*info.var_context, *info.value_var_name, vvalue); |
| } | } |
| StringOrValue sv_processed=info.r->process(*info.body_code); | Value& sv_processed=info.r->process(*info.body_code); |
| Request::Skip lskip=info.r->get_skip(); info.r->set_skip(Request::SKIP_NOTHING); | TempSkip4Delimiter skip(*info.r); |
| const String* s_processed=sv_processed.get_string(); | const String* s_processed=sv_processed.get_string(); |
| if(info.delim_maybe_code && s_processed && !s_processed->is_empty()) { // delimiter set and we have body | if(info.delim_maybe_code && s_processed && !s_processed->is_empty()) { // delimiter set and we have body |
| if(info.need_delim) // need delim & iteration produced string? | if(info.need_delim) // need delim & iteration produced string? |
| info.r->write_pass_lang(info.r->process(*info.delim_maybe_code)); | info.r->write(info.r->process(*info.delim_maybe_code)); |
| else | else |
| info.need_delim=true; | info.need_delim=true; |
| } | } |
| info.r->write_pass_lang(sv_processed); | info.r->write(sv_processed); |
| return lskip==Request::SKIP_BREAK; | return skip.check_break(); |
| } | } |
| static void _foreach(Request& r, MethodParams& params) { | static void _foreach(Request& r, MethodParams& params) { |
| Temp_hash_value<const String::Body, void*> | InCycle temp(r); |
| cycle_data_setter(r.classes_conf, cycle_data_name, /*any not null flag*/&r); | |
| const String& key_var_name=params.as_string(0, "key-var name must be string"); | const String& key_var_name=params.as_string(0, "key-var name must be string"); |
| const String& value_var_name=params.as_string(1, "value-var name must be string"); | const String& value_var_name=params.as_string(1, "value-var name must be string"); |
| Line 140 static void _foreach(Request& r, MethodP | Line 132 static void _foreach(Request& r, MethodP |
| key_var_name.is_empty()? 0 : &key_var_name, | key_var_name.is_empty()? 0 : &key_var_name, |
| value_var_name.is_empty()? 0 : &value_var_name, | value_var_name.is_empty()? 0 : &value_var_name, |
| ¶ms.as_junction(2, "body must be code"), | ¶ms.as_junction(2, "body must be code"), |
| /*delimiter*/params.count()>3 ? params.get(3) : 0, | /*delimiter*/params.count()>3 ? ¶ms[3] : 0, |
| /*var_context*/r.get_method_frame()->caller(), | /*var_context*/r.get_method_frame()->caller(), |
| false | false |
| }; | }; |