/* * Copyright (c) 2009 Norman Golisz * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include inline int calc_golden_num(int); int calc_easter_date(register int, register int); int convert_num(char *); void print_date(int, int); char *usage_str = "usage: %s || \n"; inline int calc_golden_num(year) int year; { return year % 19 + 1; } int calc_easter_date(year, gnum) register int year; register int gnum; { int sc, lc, p, d, t; if (year <= 1752) { d = (year + (year / 4) + 5) % 7; p = (3 - (11 * gnum) - 7) % 30; } else { d = (year + (year / 4) - (year / 100) + (year / 400)) % 7; sc = (year - 1600) / 100 - (year - 1600) / 400; lc = (((year - 1400) / 100) * 8) / 25; p = (3 - 11 * gnum + sc - lc) % 30; if (p < 0) p += 30; } if (p == 29 || (p == 28 && gnum > 11)) p--; if (d < 0) d += 7; t = (4 - p - d) % 7; if (t < 0) t += 7; return p + t + 1; } int convert_num(s) char *s; { return (int)strtol(s, NULL, 10); } void print_date(year, edate) int year; int edate; { printf("%i-%.2i-%.2i\n", year, (edate < 11) ? 3 : 4, (edate < 11) ? edate + 21 : edate - 10); } int main(argc, argv) int argc; char **argv; { if (argc < 2 || argc > 3) { fprintf(stderr, usage_str, argv[0]); exit(EXIT_FAILURE); } if (argc == 2) { int year, gnum, edate; year = convert_num(argv[1]); gnum = calc_golden_num(year); edate = calc_easter_date(year, gnum); print_date(year, edate); } else { int fyear, tyear, gnum, edate, i; fyear = convert_num(argv[1]); tyear = convert_num(argv[2]); if (tyear < fyear) { fprintf(stderr, usage_str, argv[0]); exit(EXIT_FAILURE); } for (i = fyear; i <= tyear; i++) { gnum = calc_golden_num(i); edate = calc_easter_date(i, gnum); print_date(i, edate); } } return EXIT_SUCCESS; }