Blame awklib/eg/prog/alarm.awk

Packit Service f629e6
# alarm.awk --- set an alarm
Packit Service f629e6
#
Packit Service f629e6
# Requires getlocaltime() library function
Packit Service f629e6
#
Packit Service f629e6
# Arnold Robbins, arnold@skeeve.com, Public Domain
Packit Service f629e6
# May 1993
Packit Service f629e6
# Revised December 2010
Packit Service f629e6
Packit Service f629e6
# usage: alarm time [ "message" [ count [ delay ] ] ]
Packit Service f629e6
Packit Service f629e6
BEGIN {
Packit Service f629e6
    # Initial argument sanity checking
Packit Service f629e6
    usage1 = "usage: alarm time ['message' [count [delay]]]"
Packit Service f629e6
    usage2 = sprintf("\t(%s) time ::= hh:mm", ARGV[1])
Packit Service f629e6
Packit Service f629e6
    if (ARGC < 2) {
Packit Service f629e6
        print usage1 > "/dev/stderr"
Packit Service f629e6
        print usage2 > "/dev/stderr"
Packit Service f629e6
        exit 1
Packit Service f629e6
    }
Packit Service f629e6
    switch (ARGC) {
Packit Service f629e6
    case 5:
Packit Service f629e6
        delay = ARGV[4] + 0
Packit Service f629e6
        # fall through
Packit Service f629e6
    case 4:
Packit Service f629e6
        count = ARGV[3] + 0
Packit Service f629e6
        # fall through
Packit Service f629e6
    case 3:
Packit Service f629e6
        message = ARGV[2]
Packit Service f629e6
        break
Packit Service f629e6
    default:
Packit Service f629e6
        if (ARGV[1] !~ /[[:digit:]]?[[:digit:]]:[[:digit:]]{2}/) {
Packit Service f629e6
            print usage1 > "/dev/stderr"
Packit Service f629e6
            print usage2 > "/dev/stderr"
Packit Service f629e6
            exit 1
Packit Service f629e6
        }
Packit Service f629e6
        break
Packit Service f629e6
    }
Packit Service f629e6
Packit Service f629e6
    # set defaults for once we reach the desired time
Packit Service f629e6
    if (delay == 0)
Packit Service f629e6
        delay = 180    # 3 minutes
Packit Service f629e6
    if (count == 0)
Packit Service f629e6
        count = 5
Packit Service f629e6
    if (message == "")
Packit Service f629e6
        message = sprintf("\aIt is now %s!\a", ARGV[1])
Packit Service f629e6
    else if (index(message, "\a") == 0)
Packit Service f629e6
        message = "\a" message "\a"
Packit Service f629e6
    # split up alarm time
Packit Service f629e6
    split(ARGV[1], atime, ":")
Packit Service f629e6
    hour = atime[1] + 0    # force numeric
Packit Service f629e6
    minute = atime[2] + 0  # force numeric
Packit Service f629e6
Packit Service f629e6
    # get current broken down time
Packit Service f629e6
    getlocaltime(now)
Packit Service f629e6
Packit Service f629e6
    # if time given is 12-hour hours and it's after that
Packit Service f629e6
    # hour, e.g., `alarm 5:30' at 9 a.m. means 5:30 p.m.,
Packit Service f629e6
    # then add 12 to real hour
Packit Service f629e6
    if (hour < 12 && now["hour"] > hour)
Packit Service f629e6
        hour += 12
Packit Service f629e6
Packit Service f629e6
    # set target time in seconds since midnight
Packit Service f629e6
    target = (hour * 60 * 60) + (minute * 60)
Packit Service f629e6
Packit Service f629e6
    # get current time in seconds since midnight
Packit Service f629e6
    current = (now["hour"] * 60 * 60) + \
Packit Service f629e6
               (now["minute"] * 60) + now["second"]
Packit Service f629e6
Packit Service f629e6
    # how long to sleep for
Packit Service f629e6
    naptime = target - current
Packit Service f629e6
    if (naptime <= 0) {
Packit Service f629e6
        print "alarm: time is in the past!" > "/dev/stderr"
Packit Service f629e6
        exit 1
Packit Service f629e6
    }
Packit Service f629e6
    # zzzzzz..... go away if interrupted
Packit Service f629e6
    if (system(sprintf("sleep %d", naptime)) != 0)
Packit Service f629e6
        exit 1
Packit Service f629e6
Packit Service f629e6
    # time to notify!
Packit Service f629e6
    command = sprintf("sleep %d", delay)
Packit Service f629e6
    for (i = 1; i <= count; i++) {
Packit Service f629e6
        print message
Packit Service f629e6
        # if sleep command interrupted, go away
Packit Service f629e6
        if (system(command) != 0)
Packit Service f629e6
            break
Packit Service f629e6
    }
Packit Service f629e6
Packit Service f629e6
    exit 0
Packit Service f629e6
}