--- parser3/src/classes/table.C 2001/10/23 14:43:44 1.128 +++ parser3/src/classes/table.C 2001/11/22 15:47:12 1.133 @@ -2,9 +2,9 @@ Parser: @b table parser class. Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + Author: Alexander Petrosyan (http://paf.design.ru) - $Id: table.C,v 1.128 2001/10/23 14:43:44 parser Exp $ + $Id: table.C,v 1.133 2001/11/22 15:47:12 paf Exp $ */ #include "classes.h" @@ -129,6 +129,7 @@ static void _load(Request& r, const Stri static_cast(r.self)->set_table(table); } +/// @todo "z\nz" "zzz""zz" static void _save(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); Value& vfile_name=params->as_no_junction(params->size()-1, @@ -136,8 +137,9 @@ static void _save(Request& r, const Stri Table& table=static_cast(r.self)->table(); + bool do_append=false; String sdata(pool); - if(params->size()==1) { // not nameless=named output + if(params->size()==1) { // named output // write out names line if(table.columns()) { // named table Array_iter i(*table.columns()); @@ -158,6 +160,17 @@ static void _save(Request& r, const Stri sdata.APPEND_CONST("empty nameless table"); } sdata.APPEND_CONST("\n"); + } else { // mode specified + const String& mode=params->as_string(0, "mode must be string"); + if(mode=="append") + do_append=true; + else if(mode=="nameless") + /*ok, already skipped names output*/; + else + throw Exception(0, 0, + &mode, + "unknown mode, must be 'append'"); + } // data lines Array_iter i(table); @@ -174,7 +187,7 @@ static void _save(Request& r, const Stri // write file_write(pool, r.absolute(vfile_name.as_string()), - sdata.cstr(), sdata.size(), true); + sdata.cstr(), sdata.size(), true, do_append); } static void _count(Request& r, const String& method_name, MethodParams *) { @@ -195,8 +208,22 @@ static void _offset(Request& r, const St Pool& pool=r.pool(); Table& table=static_cast(r.self)->table(); if(params->size()) { - Value& offset_expr=params->as_junction(0, "offset must be expression"); - table.shift(r.process(offset_expr).as_int()); + bool absolute=false; + if(params->size()>1) { + const String& whence=params->as_string(0, "whence must be string"); + if(whence=="cur") + absolute=false; + else if(whence=="set") + absolute=true; + else + throw Exception(0, 0, + &whence, + "is invalid whence, valid are 'cur' or 'set'"); + } + + + Value& offset_expr=params->as_junction(params->size()-1, "offset must be expression"); + table.offset(absolute, r.process(offset_expr).as_int()); } else { Value& value=*new(pool) VInt(pool, table.current()); value.set_name(method_name); @@ -589,8 +616,9 @@ MTable::MTable(Pool& apool) : Methoded(a add_native_method("line", Method::CT_DYNAMIC, _line, 0, 0); // ^table.offset[] - // ^table.offset[offset] - add_native_method("offset", Method::CT_DYNAMIC, _offset, 0, 1); + // ^table.offset(offset) + // ^table.offset[cur|set](offset) + add_native_method("offset", Method::CT_DYNAMIC, _offset, 0, 2); // ^table.menu{code} // ^table.menu{code}[delim]