--- parser3/src/classes/table.C 2001/03/19 19:17:41 1.17 +++ parser3/src/classes/table.C 2001/03/20 06:45:16 1.21 @@ -1,9 +1,11 @@ -/* - Parser +/** @file + Parser: table parser class. + Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexander Petrosyan (http://design.ru/paf) - $Id: table.C,v 1.17 2001/03/19 19:17:41 paf Exp $ + $Id: table.C,v 1.21 2001/03/20 06:45:16 paf Exp $ */ #include "pa_common.h" @@ -24,21 +26,29 @@ static void set_or_load( bool is_load) { Pool& pool=r.pool(); // data is last parameter - Value *vdata=static_cast(params->get(params->size()-1)); + Value *vdata_or_filename=static_cast(params->get(params->size()-1)); // forcing - // ^load[this body type] + // ^load[this file name type] // ^set{this body type} - r.fail_if_junction_(is_load, *vdata, - method_name, is_load?"body must not be junction":"body must be junction"); + r.fail_if_junction_(is_load, *vdata_or_filename, + method_name, is_load?"file name must not be junction":"body must be junction"); // data or file_name - char *data_or_filename; - { + char *ldata_or_filename; + if(is_load) { + // forcing untaint language + String lfile_name(pool); + lfile_name.append(vdata_or_filename->as_string(), + String::Untaint_lang::FILE_NAME, true); + ldata_or_filename=lfile_name.cstr(); + } else { + // suggesting untaint language Temp_lang temp_lang(r, String::Untaint_lang::TABLE); - data_or_filename=r.process(*vdata).as_string().cstr(); + ldata_or_filename=r.process(*vdata_or_filename).as_string().cstr(); } // data - char *data=is_load?file_read(pool, r.absolute(data_or_filename)):data_or_filename; + char *data=is_load? + file_read(pool, r.absolute(ldata_or_filename)/*\, false*/):ldata_or_filename; // parse columns Array *columns; @@ -75,7 +85,7 @@ static void set_or_load( }; // replace any previous table value - r.self->as_vtable().set_table(table); + static_cast(r.self)->set_table(table); } @@ -89,19 +99,19 @@ static void _load(Request& r, const Stri static void _count(Request& r, const String&, Array *) { Pool& pool=r.pool(); - Value& value=*new(pool) VInt(pool, r.self->as_vtable().table().size()); + Value& value=*new(pool) VInt(pool, static_cast(r.self)->table().size()); r.write_no_lang(value); } static void _line(Request& r, const String&, Array *) { Pool& pool=r.pool(); - Value& value=*new(pool) VInt(pool, 1+r.self->as_vtable().table().get_current()); + Value& value=*new(pool) VInt(pool, 1+static_cast(r.self)->table().get_current()); r.write_no_lang(value); } static void _offset(Request& r, const String&, Array *params) { Pool& pool=r.pool(); - Table& table=r.self->as_vtable().table(); + Table& table=static_cast(r.self)->table(); if(params->size()) { if(int size=table.size()) { int offset= @@ -122,7 +132,7 @@ static void _menu(Request& r, const Stri Value *delim_code=params->size()==2?static_cast(params->get(1)):0; - Table& table=r.self->as_vtable().table(); + Table& table=static_cast(r.self)->table(); bool need_delim=false; for(int i=0; ias_vtable().table(); + Table& table=static_cast(r.self)->table(); if(table.size()==0) { Value& value=r.process(*static_cast(params->get(0))); r.write_pass_lang(value);