Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "all.h"

Timet
toytime(void)
{
        return time(nil);
}

void
datestr(char *s, Timet t)
{
        Tm *tm;

        tm = localtime(t);
        sprint(s, "%.4d%.2d%.2d", tm->year+1900, tm->mon+1, tm->mday);
}

void
prdate(void)
{
        print("%T\n", time(nil));
}

static void
ct_numb(char *cp, int n)
{
        if(n >= 10)
                cp[0] = (n/10)%10 + '0';
        else
                cp[0] = ' ';
        cp[1] = n%10 + '0';
}

int
Tfmt(Fmt* fmt)
{
        char s[30];
        char *cp;
        Timet t;
        Tm *tm;

        t = va_arg(fmt->args, Timet);
        if(t == 0)
                return fmtstrcpy(fmt, "The Epoch");

        tm = localtime(t);
        strcpy(s, "Day Mon 00 00:00:00 1900");
        cp = &"SunMonTueWedThuFriSat"[tm->wday*3];
        s[0] = cp[0];
        s[1] = cp[1];
        s[2] = cp[2];
        cp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[tm->mon*3];
        s[4] = cp[0];
        s[5] = cp[1];
        s[6] = cp[2];
        ct_numb(s+8, tm->mday);
        ct_numb(s+11, tm->hour+100);
        ct_numb(s+14, tm->min+100);
        ct_numb(s+17, tm->sec+100);
        if(tm->year >= 100) {
                s[20] = '2';
                s[21] = '0';
        }
        ct_numb(s+22, tm->year+100);

        return fmtstrcpy(fmt, s);
}

/*
 * compute the next time after t
 * that has hour hr and is not on
 * day in bitpattern --
 * for automatic dumps
 */
Timet
nextime(Timet t, int hr, int day)
{
        int nhr;
        Tm *tm;

        if(hr < 0 || hr >= 24)
                hr = 5;
        if((day&0x7f) == 0x7f)
                day = 0;
        for (;;) {
                tm = localtime(t);
                t -= tm->sec;
                t -= tm->min*60;
                nhr = tm->hour;
                do {
                        t += 60*60;
                        nhr++;
                } while(nhr%24 != hr);
                tm = localtime(t);
                if(tm->hour != hr) {
                        t += 60*60;
                        tm = localtime(t);
                        if(tm->hour != hr) {
                                t -= 60*60;
                                tm = localtime(t);
                        }
                }
                if(day & (1<<tm->wday))
                        t += 12*60*60;
                else
                        return t;
        }
}

/*
 *  delay for l milliseconds more or less.
 */
void
delay(int l)
{
        sleep(l);
}