--- parser3/src/classes/date.C 2015/09/22 13:53:04 1.97 +++ parser3/src/classes/date.C 2016/03/29 10:18:54 1.101 @@ -1,7 +1,7 @@ /** @file Parser: @b date parser class. - Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ @@ -13,7 +13,7 @@ #include "pa_vdate.h" #include "pa_vtable.h" -volatile const char * IDENT_DATE_C="$Id: date.C,v 1.97 2015/09/22 13:53:04 moko Exp $" IDENT_PA_VDATE_H; +volatile const char * IDENT_DATE_C="$Id: date.C,v 1.101 2016/03/29 10:18:54 moko Exp $" IDENT_PA_VDATE_H; // class @@ -50,9 +50,9 @@ Table date_calendar_table_template(new D static void _now(Request& r, MethodParams& params) { VDate& vdate=GET_SELF(r, VDate); - time_t t=time(0); + pa_time_t t=(pa_time_t)time(0); if(params.count()==1) // ^now(offset) - t+=(time_t)round(params.as_double(0, "offset must be double", r)*SECS_PER_DAY); + t+=(pa_time_t)round(params.as_double(0, "offset must be double", r)*SECS_PER_DAY); vdate.set_time(t); } @@ -138,29 +138,34 @@ static char *skip_writespace(char* str) } static char *numeric_tz(char prefix, char* tz) { - char *cur=tz; + // preparing POSIX TZ format + char *buf=new(PointerFreeGC) char[4+5+1/*zero-teminator*/]; + strcpy(buf, prefix=='+' ? "SUB-":"SUB+"); + char *cur=buf+4; + // hours - if(!isdigit(*(cur++))) + if(!isdigit(*(cur++)=*(tz++))) return 0; - if(isdigit(cur[0])) - cur++; - if(cur[0] == ':'){ - // optional minutes - cur++; - if(!isdigit(*(cur++))) + if(isdigit(tz[0])) + *(cur++)=*(tz++); + + if(tz[0] == ':'){ + // HH:mm format + *(cur++)=*(tz++); + if(!isdigit(*(cur++)=*(tz++))) + return 0; + if(isdigit(tz[0])) + *(cur++)=*(tz++); + } else if(isdigit(tz[0])){ + // HHmm format + *(cur++)=':'; + if(!isdigit(*(cur++)=*(tz++)) || !isdigit(*(cur++)=*(tz++))) return 0; - if(isdigit(cur[0])) - cur++; } // nothing more - if(skip_writespace(cur)) + if(skip_writespace(tz)) return 0; - // returning POSIX TZ format - size_t size=4+(cur-tz)+1/*zero-teminator*/; - char *buf=new(PointerFreeGC) char[size]; - strcpy(buf, prefix=='+' ? "SUB-":"SUB+"); - strncpy(buf+4, tz, cur-tz); - buf[size-1]=0; + *cur=0; return buf; } @@ -290,10 +295,34 @@ static void _gmt_string(Request& r, Meth r.write_assign_lang(*vdate.get_gmt_string()); } -static void _iso_string(Request& r, MethodParams&) { +static void _iso_string(Request& r, MethodParams& params) { VDate& vdate=GET_SELF(r, VDate); - r.write_assign_lang(*vdate.get_iso_string()); + VDate::iso_string_type format=VDate::iso_string_default; + + if(params.count()>0) + if(HashStringValue* options=params.as_hash(0)){ + int valid_options=0; + if(Value* vshow_ms=options->get("ms")){ + if(r.process_to_value(*vshow_ms).as_bool()) + format=VDate::iso_string_type(format|VDate::iso_string_ms); + valid_options++; + } + if(Value* vshow_colon=options->get("colon")){ + if(!r.process_to_value(*vshow_colon).as_bool()) + format=VDate::iso_string_type(format|VDate::iso_string_no_colon); + valid_options++; + } + if(Value* vshow_z=options->get("z")){ + if(!r.process_to_value(*vshow_z).as_bool()) + format=VDate::iso_string_type(format|VDate::iso_string_no_z); + valid_options++; + } + if(valid_options != options->count()) + throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); + } + + r.write_assign_lang(*vdate.get_iso_string(format)); } static void _roll(Request& r, MethodParams& params) { @@ -519,8 +548,8 @@ MDate::MDate(): Methoded("date") { // ^date.gmt-string[] add_native_method("gmt-string", Method::CT_DYNAMIC, _gmt_string, 0, 0); - // ^date.iso-string[] - add_native_method("iso-string", Method::CT_DYNAMIC, _iso_string, 0, 0); + // ^date.iso-string[$.colon(true) $.z(true) $.ms(false)] + add_native_method("iso-string", Method::CT_DYNAMIC, _iso_string, 0, 1); // ^date:lastday(year;month) // ^date.lastday[]