From c90abc793cae72a682bfa53b638c5e0ba07c6644 Mon Sep 17 00:00:00 2001 From: "Mirar (Pontus Hagland)" <pike@sort.mirar.org> Date: Fri, 20 Nov 1998 23:36:37 +0100 Subject: [PATCH] stardate added, parse function in calendar.gregorian (and derivates) Rev: lib/modules/Calendar.pmod/Gregorian.pmod:1.17 Rev: lib/modules/Calendar.pmod/Stardate.pmod:1.1 --- lib/modules/Calendar.pmod/Gregorian.pmod | 136 ++++++++++++++++++++++- lib/modules/Calendar.pmod/Stardate.pmod | 106 ++++++++++++++++++ 2 files changed, 240 insertions(+), 2 deletions(-) create mode 100644 lib/modules/Calendar.pmod/Stardate.pmod diff --git a/lib/modules/Calendar.pmod/Gregorian.pmod b/lib/modules/Calendar.pmod/Gregorian.pmod index 3fbe43ea13..0cab581a4f 100644 --- a/lib/modules/Calendar.pmod/Gregorian.pmod +++ b/lib/modules/Calendar.pmod/Gregorian.pmod @@ -8,7 +8,7 @@ //! class array(string) month_names= - ({"January","February","March","April","May","June","July","August", + ({"January","February","Mars","April","May","June","July","August", "September","October","November","December"}); array(string) week_day_names= @@ -53,6 +53,11 @@ class Year //-- standard methods ----------------------------------------------- + string is() + { + return "year"; + } + array(string) lesser() { return ({"month","week","day"}); @@ -282,6 +287,11 @@ class Month //-- standard methods ----------------------------------------------- + string is() + { + return "month"; + } + array(string) lesser() { return ({"day"}); @@ -425,6 +435,11 @@ class Week //-- standard methods ----------------------------------------------- + string is() + { + return "week"; + } + array(string) lesser() { return ({"day"}); @@ -592,6 +607,11 @@ class Day //-- standard methods ----------------------------------------------- + string is() + { + return "day"; + } + array(string) greater() { return ({"year","month","week"}); @@ -602,7 +622,7 @@ class Day return ({"hour"}); } - void create(int ... arg) + void create(int|object ... arg) { if (!sizeof(arg)) { @@ -610,6 +630,31 @@ class Day y=1900+t->year; d=t->yday; } + else if (sizeof(arg)==1) + { + int jd; + + if (objectp(arg[0])) + jd=(int)((arg[0]->julian_day||arg[0]->julian_day_f)()); + else + jd=arg[0]; + + object yo; + y=(int)(jd/365.2425)-4712; + yo=vYear(y); + while (yo->julian_day(0)>jd) yo--; + write("y="+yo->number()+" yd="+yo->julian_day(0)+" nod="+yo->number_of_days()+"\n"); + while (jd-yo->julian_day(0)>=yo->number_of_days()) + { + yo++; + write("y="+yo->number()+" yd="+yo->julian_day(0)+" nod="+yo->number_of_days()+"\n"); + + } + y=yo->number(); + write("y="+y+"\n"); + d=jd-vYear(y)->julian_day(0); + write("d="+d+"\n"); + } else { y=arg[0]; @@ -783,6 +828,11 @@ class Hour //-- standard methods ----------------------------------------------- + string is() + { + return "hour"; + } + array(string) greater() { return ({"day"}); @@ -959,6 +1009,11 @@ class Minute //-- standard methods ----------------------------------------------- + string is() + { + return "minute"; + } + array(string) greater() { return ({"hour"}); @@ -1152,6 +1207,11 @@ class Second //-- standarm setsoms ----------------------------------------------- + string is() + { + return "second"; + } + array(string) greater() { return ({"minute","hour","day","month","year"}); @@ -1331,4 +1391,76 @@ class Second }; +//-- parse functions ----------------------------------------------- + +//! method object parse(string fmt,string arg) +//! parse a date, create relevant object +//! fmt is in the format "abc%xdef..." +//! where abc and def is matched, and %x is +//! one of those time units: +//! %Y absolute year +//! %y year (70-99 is 1970-1999, 0-69 is 2000-2069) +//! %M month (number, name or short name) (needs %y) +//! %W week (needs %y) +//! %D date (needs %y, %m) +//! %a day (needs %y) +//! %e weekday (needs %y, %w) +//! %h hour (needs %d, %D or %W) +//! %m minute (needs %h) +//! %s second (needs %s) + +object parse(string fmt,string arg) +{ + string nfmt; + nfmt=replace(fmt, + ({"%Y","%y","%M","%W","%D","%a","%e","%h","%m","%s"}), + ({"%s","%s","%s","%s","%s","%s","%s","%s","%s","%s"})); + array q=Array.map(replace(fmt,"%%","")/"%", + lambda(string s){ return s[..0];})-({""}); + array res=Array.map(array_sscanf(arg,nfmt), + lambda(string s) + { + if (s[0]>='0' && s[0]<='9') + return array_sscanf(s,"%d")[0]; + else + return s; + }); + + if (sizeof(res)<sizeof(q)) + return 0; // parse error + + mapping m=mkmapping(q,res); + + if (m->Y) m->year=Year(m->Y); + else if (m->y) + { + if (m->y<70) m->y+=2000; + else if (m->y<100) m->y+=1900; + m->year=Year(m->y); + } + else m->year=Year(); + + object low=m->year; + + if (m->M) + m->month=low=m->year->month(m->M); + if (m->W) + m->week=low=m->year->week(m->W); + + if (m->D) + m->day=low=(m->month||Month())->day(m->D); + else if (m->a) + m->day=low=m->year->day(m->a); + else if (m->e) + m->day=low=(m->week||Week())->day(m->e); + + if (m->h) + low=m->hour=(m->day||Day())->hour(m->h); + if (m->m) + low=m->minute=(m->hour||Hour())->minute(m->m); + if (m->s) + low=m->second=(m->minute||Minute())->second(m->s); + + return low; +} diff --git a/lib/modules/Calendar.pmod/Stardate.pmod b/lib/modules/Calendar.pmod/Stardate.pmod new file mode 100644 index 0000000000..a91e964fca --- /dev/null +++ b/lib/modules/Calendar.pmod/Stardate.pmod @@ -0,0 +1,106 @@ +//! submodule Stardate +//! time unit: TNGDate + +//! class TNGDate +//! implements ST:TNG stardates +//! can be used as create argument to Day + +class TNGDate +{ + inherit Calendar._TimeUnit; + + // 40759.5 2363-10-05 2584405 + // 47391.2 2370-05-23 2586827 + + // 50893.5 2373-11-23 2588107 + + // 6631.7 ---------- 2422 + // 10134.0 ---------- 3702 + // 1000.0 ---------- 365.2425 + // 0.0 - - 2569519 +#define TNGSTARPERJULIAN (1000.0/365.2425) + +//-- variables ------------------------------------------------------ + + float jd; + float tics; + +//-- standard methods ----------------------------------------------- + + void create(int|float|object ... day) + { + float jd; + if (!sizeof(day)) + day=({Calendar.Gregorian.Second()}); + else if (floatp(day[0])) + { + from_stardate(day[0]); + return; + } + if (!intp(day[0])) + { + object o=day[0]; + + if (o->julian_day || o->julian_day_f) + jd=(float)(o->julian_day_f||o->julian_day)(); + else // dig + if (o->day) // larger + { + o=o->day(0); + if (o->julian_day_f) + jd=o->julian_day_f(); + else if (o->julian_day) + jd=(float)o->julian_day(); + else + ; // error, like + } + else // smaller + { + float z=1.0; + while (sizeof(o->greater())) + { + string name=o->is(); + o=o[o->greater()[0]](); + z*=o["number_of_"+name+"s"](); + if (o->julian_day_f || o->julian_day) + { + jd=(o->julian_day||o->julian_day_f)()/z; + break; + } + } + } + } + else + jd=(float)day[0]; + from_julian_day(jd); + } + + static void from_stardate(float f) + { + tics=f; + jd=f/TNGSTARPERJULIAN+2569518.5; + } + + static void from_julian_day(float f) + { + jd=f; + tics=(f-2569518.5)*TNGSTARPERJULIAN; + } + +//-- nonstandard methods -------------------------------------------- + + float number() + { + return tics; + } + + int julian_day() + { + return (int)jd; + } + + float julian_day_f() + { + return jd; + } +} -- GitLab