procedure main()
s := "Mon Dec 8"
s ? write(Mdate() | "not a valid date")
end
# Define a matching function that returns
# a string that matches a day month dayofmonth
procedure Mdate()
# Define some initial values
static dates
static days
initial {
days := ["Mon","Tue","Wed","Thr","Fri","Sat","Sun"]
dates := ["Jan","Feb","Mar","Apr","May","Jun",
"Jul","Aug","Sep","Oct","Nov","Dec"]
}
every suspend (retval <- tab(match(!days)) || # Match a day
=" " || # Followed by a blank
tab(match(!dates)) || # Followed by the month
=" " || # Followed by a blank
matchdigits(2) # Followed by at least 2 digits
) &
(=" " | pos(0) ) & # Either a blank or the end of the string
retval # And finally return the string
end
# Matching function that returns a string of n digits
procedure matchdigits(n)
suspend (v := tab(many(&digits)) & *v <= n) & v
end
cHJvY2VkdXJlIG1haW4oKQogICAgcyA6PSAiTW9uIERlYyA4IgogICAgcyA/IHdyaXRlKE1kYXRlKCkgfCAibm90IGEgdmFsaWQgZGF0ZSIpCmVuZAojIERlZmluZSBhIG1hdGNoaW5nIGZ1bmN0aW9uIHRoYXQgcmV0dXJucwojIGEgc3RyaW5nIHRoYXQgbWF0Y2hlcyBhIGRheSBtb250aCBkYXlvZm1vbnRoCnByb2NlZHVyZSBNZGF0ZSgpCiMgRGVmaW5lIHNvbWUgaW5pdGlhbCB2YWx1ZXMKc3RhdGljIGRhdGVzCnN0YXRpYyBkYXlzCmluaXRpYWwgewogICAgICAgZGF5cyA6PSBbIk1vbiIsIlR1ZSIsIldlZCIsIlRociIsIkZyaSIsIlNhdCIsIlN1biJdCiAgICAgICBkYXRlcyA6PSBbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsCiAgICAgICAgICAgICAgICAgIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdCn0KZXZlcnkgc3VzcGVuZCAgIChyZXR2YWwgPC0gIHRhYihtYXRjaCghZGF5cykpIHx8ICAgICAjIE1hdGNoIGEgZGF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IiAiIHx8ICAgICAgICAgICAgICAgICAgIyBGb2xsb3dlZCBieSBhIGJsYW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWIobWF0Y2goIWRhdGVzKSkgfHwgICAgIyBGb2xsb3dlZCBieSB0aGUgbW9udGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0iICIgfHwgICAgICAgICAgICAgICAgICAjIEZvbGxvd2VkIGJ5IGEgYmxhbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZGlnaXRzKDIpICAgICAgICAgICAjIEZvbGxvd2VkIGJ5IGF0IGxlYXN0IDIgZGlnaXRzIAogICAgICAgICAgICAgICAgKSAmCiAgICAgICAgICAgICAgICAoPSIgIiB8IHBvcygwKSApICYgICAgICAgICAgICAgICAgICAgIyBFaXRoZXIgYSBibGFuayBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKICAgICAgICAgICAgICAgIHJldHZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFuZCBmaW5hbGx5IHJldHVybiB0aGUgc3RyaW5nCmVuZAojIE1hdGNoaW5nIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHN0cmluZyBvZiBuIGRpZ2l0cwpwcm9jZWR1cmUgbWF0Y2hkaWdpdHMobikKICAgIHN1c3BlbmQgKHYgOj0gdGFiKG1hbnkoJmRpZ2l0cykpICYgKnYgPD0gbikgJiB2CmVuZAoK