|
|
| version 1.31, 2024/10/28 00:18:25 | version 1.41, 2025/05/28 00:58:02 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: @b array parser class. | Parser: @b array parser class. |
| Copyright (c) 2001-2023 Art. Lebedev Studio (http://www.artlebedev.com) | Copyright (c) 2001-2024 Art. Lebedev Studio (http://www.artlebedev.com) |
| Authors: Konstantin Morshnev <moko@design.ru>, Alexandr Petrosian <paf@design.ru> | Authors: Konstantin Morshnev <moko@design.ru>, Alexandr Petrosian <paf@design.ru> |
| */ | */ |
| Line 53 static void _copy_or_add(Request& r, Met | Line 53 static void _copy_or_add(Request& r, Met |
| self_array.put(i.index(), i.value()); | self_array.put(i.index(), i.value()); |
| } | } |
| } else { | } else { |
| self_array.append(src->array()); | self_array.copy(src->array()); |
| return; | |
| } | } |
| } else { | } else { |
| HashStringValue* src_hash=vsrc.as_hash("param must be array or"); | HashStringValue* src_hash=vsrc.as_hash("param must be array or"); |
| Line 587 static void _keys(Request& r, MethodPara | Line 588 static void _keys(Request& r, MethodPara |
| for(ArrayValue::Iterator i(array); i; i.next()){ | for(ArrayValue::Iterator i(array); i; i.next()){ |
| if(i.value()){ | if(i.value()){ |
| Table::element_type row(new ArrayString(1)); | Table::element_type row(new ArrayString(1)); |
| *row+=new String(i.key(), String::L_TAINTED); | *row+=new String(pa_uitoa(i.index())); |
| *table+=row; | *table+=row; |
| } | } |
| } | } |
| Line 656 static void _remove(Request& r, MethodPa | Line 657 static void _remove(Request& r, MethodPa |
| array.invalidate(); | array.invalidate(); |
| } | } |
| static void _pop(Request& r, MethodParams& params) { | static void _pop(Request& r, MethodParams&) { |
| ArrayValue& array=GET_SELF(r, VArray).array(); | ArrayValue& array=GET_SELF(r, VArray).array(); |
| Value *result=array.pop(); | Value *result=array.pop(); |
| if(result){ | if(result){ |
| Line 690 static void _for(Request& r, MethodParam | Line 691 static void _for(Request& r, MethodParam |
| if(delim_maybe_code){ // delimiter set | if(delim_maybe_code){ // delimiter set |
| bool need_delim=false; | bool need_delim=false; |
| for(ArrayValue::Iterator i(array); i; i.next()){ | for(ArrayValue::RobustIterator i(array); i; i.next()){ |
| if(key_var_name){ | if(key_var_name) |
| VString* vkey=new VString(*new String(i.key(), String::L_TAINTED)); | r.put_element(caller, *key_var_name, VString::uitoa(i.index())); |
| r.put_element(caller, *key_var_name, vkey); | |
| } | |
| if(value_var_name) | if(value_var_name) |
| r.put_element(caller, *value_var_name, i.value() ? i.value() : VVoid::get()); | r.put_element(caller, *value_var_name, i.value() ? i.value() : VVoid::get()); |
| Line 716 static void _for(Request& r, MethodParam | Line 714 static void _for(Request& r, MethodParam |
| break; | break; |
| } | } |
| } else { | } else { |
| for(ArrayValue::Iterator i(array); i; i.next()){ | for(ArrayValue::RobustIterator i(array); i; i.next()){ |
| if(key_var_name){ | if(key_var_name) |
| VString* vkey=new VString(*new String(i.key(), String::L_TAINTED)); | r.put_element(caller, *key_var_name, VString::uitoa(i.index())); |
| r.put_element(caller, *key_var_name, vkey); | |
| } | |
| if(value_var_name) | if(value_var_name) |
| r.put_element(caller, *value_var_name, i.value() ? i.value() : VVoid::get()); | r.put_element(caller, *value_var_name, i.value() ? i.value() : VVoid::get()); |
| Line 749 static void _foreach(Request& r, MethodP | Line 744 static void _foreach(Request& r, MethodP |
| if(delim_maybe_code){ // delimiter set | if(delim_maybe_code){ // delimiter set |
| bool need_delim=false; | bool need_delim=false; |
| for(ArrayValue::Iterator i(array); i; i.next()){ | for(ArrayValue::RobustIterator i(array); i; i.next()){ |
| if(i.value()){ | if(i.value()){ |
| if(key_var_name){ | if(key_var_name) |
| VString* vkey=new VString(*new String(i.key(), String::L_TAINTED)); | r.put_element(caller, *key_var_name, VString::uitoa(i.index())); |
| r.put_element(caller, *key_var_name, vkey); | |
| } | |
| if(value_var_name) | if(value_var_name) |
| r.put_element(caller, *value_var_name, i.value()); | r.put_element(caller, *value_var_name, i.value()); |
| Line 777 static void _foreach(Request& r, MethodP | Line 769 static void _foreach(Request& r, MethodP |
| } | } |
| } | } |
| } else { | } else { |
| for(ArrayValue::Iterator i(array); i; i.next()){ | for(ArrayValue::RobustIterator i(array); i; i.next()){ |
| if(i.value()){ | if(i.value()){ |
| if(key_var_name){ | if(key_var_name) |
| VString* vkey=new VString(*new String(i.key(), String::L_TAINTED)); | r.put_element(caller, *key_var_name, VString::uitoa(i.index())); |
| r.put_element(caller, *key_var_name, vkey); | |
| } | |
| if(value_var_name) | if(value_var_name) |
| r.put_element(caller, *value_var_name, i.value()); | r.put_element(caller, *value_var_name, i.value()); |
| Line 841 static void _sort(Request& r, MethodPara | Line 830 static void _sort(Request& r, MethodPara |
| int pos=0; | int pos=0; |
| bool key_values_are_strings=true; | bool key_values_are_strings=true; |
| for(ArrayValue::Iterator i(array); i; i.next() ){ | for(ArrayValue::RobustIterator i(array); i; i.next() ){ |
| if(i.value()){ | if(i.value()){ |
| if(key_var) | if(key_var) |
| r.put_element(*context, *key_var, new VString(*new String(i.key(), String::L_TAINTED))); | r.put_element(*context, *key_var, VString::uitoa(i.index())); |
| if(value_var) | if(value_var) |
| r.put_element(*context, *value_var, i.value()); | r.put_element(*context, *value_var, i.value()); |
| Line 915 static void _at(Request& r, MethodParams | Line 904 static void _at(Request& r, MethodParams |
| if(count == array.count()){ | if(count == array.count()){ |
| l1: switch(result_type) { | l1: switch(result_type) { |
| case AtResultTypeKey: | case AtResultTypeKey: |
| r.write(*new VString(*new String(pa_uitoa(pos), String::L_TAINTED))); | r.write(*VString::uitoa(pos)); |
| break; | break; |
| case AtResultTypeValue: | case AtResultTypeValue: |
| r.write(*array.get(pos)); | r.write(*array.get(pos)); |
| break; | break; |
| case AtResultTypeHash: | case AtResultTypeHash: |
| r.write(SingleElementHash(pa_uitoa(pos), array.get(pos))); | r.write(SingleElementHash(String::Body::uitoa(pos), array.get(pos))); |
| break; | break; |
| } | } |
| } else if((size_t)pos == count-1){ | } else if((size_t)pos == count-1){ |
| Line 932 l1: switch(result_type) { | Line 921 l1: switch(result_type) { |
| if(i.value() && !(pos--)){ | if(i.value() && !(pos--)){ |
| switch(result_type) { | switch(result_type) { |
| case AtResultTypeKey: | case AtResultTypeKey: |
| r.write(*new VString(*new String(i.key(), String::L_TAINTED))); | r.write(*VString::uitoa(i.index())); |
| break; | break; |
| case AtResultTypeValue: | case AtResultTypeValue: |
| r.write(*i.value()); | r.write(*i.value()); |
| break; | break; |
| case AtResultTypeHash: | case AtResultTypeHash: |
| r.write(SingleElementHash(i.key(), i.value())); | r.write(SingleElementHash(String::Body::uitoa(i.index()), i.value())); |
| break; | break; |
| } | } |
| break; | break; |
| Line 964 static void _set(Request& r, MethodParam | Line 953 static void _set(Request& r, MethodParam |
| } else { | } else { |
| for(ArrayValue::Iterator i(array); i; i.next() ){ | for(ArrayValue::Iterator i(array); i; i.next() ){ |
| if(i.value() && !(pos--)){ | if(i.value() && !(pos--)){ |
| array.put(pos, &r.process(params[1])); | array.put(i.index(), &r.process(params[1])); |
| return; | return; |
| } | } |
| } | } |
| Line 1016 static void _select(Request& r, MethodPa | Line 1005 static void _select(Request& r, MethodPa |
| for(ArrayValue::ReverseIterator i(source_array); i; ){ | for(ArrayValue::ReverseIterator i(source_array); i; ){ |
| if(Value *value=i.prev()){ // here for correct i.key() | if(Value *value=i.prev()){ // here for correct i.key() |
| if(key_var_name) | if(key_var_name) |
| r.put_element(caller, *key_var_name, new VString(*new String(i.key(), String::L_TAINTED))); | r.put_element(caller, *key_var_name, VString::uitoa(i.index())); |
| if(value_var_name) | if(value_var_name) |
| r.put_element(caller, *value_var_name, value); | r.put_element(caller, *value_var_name, value); |
| Line 1033 static void _select(Request& r, MethodPa | Line 1022 static void _select(Request& r, MethodPa |
| } | } |
| } | } |
| } else { | } else { |
| for(ArrayValue::Iterator i(source_array); i; i.next() ){ | for(ArrayValue::RobustIterator i(source_array); i; i.next() ){ |
| if(Value *value=i.value()){ | if(Value *value=i.value()){ |
| if(key_var_name) | if(key_var_name) |
| r.put_element(caller, *key_var_name, new VString(*new String(i.key(), String::L_TAINTED))); | r.put_element(caller, *key_var_name, VString::uitoa(i.index())); |
| if(value_var_name) | if(value_var_name) |
| r.put_element(caller, *value_var_name, value); | r.put_element(caller, *value_var_name, value); |