/* DiscDate.C .. converts boring normal dates to fun Discordian Date -><- written the 65th day of The Aftermath in the Year of Our Lady of Discord 3157 by Druel the Chaotic aka Jeremy Johnson aka mpython@gnu.ai.mit.edu Worcester MA 01609 and I'm not responsible if this program messes anything up (except your mind, I'm responsible for that) ... a.k.a. erisdate.c ... modified by Johnny Sweetmorn, 40th day of Confusion, YOLD 3169. + altered date formatting to my likeage + changed stderr `help' message + fixed 11th, 12th, etc. misfeature */ #include #include #include struct disc_time { int season; /* 0-4 */ int day; /* 0-72 */ int yday; /* 0-365 */ int year; /* 3066- */ }; char *ending (int); void print (struct disc_time, char **); struct disc_time convert (int, int); struct disc_time makeday (int, int, int); main (int argc, char **argv) { long t; struct tm *eris; int bob, raw; struct disc_time hastur; if (argc == 4) { int moe, larry, curly; moe = atoi (argv[1]); larry = atoi (argv[2]); curly = atoi (argv[3]); hastur = makeday (moe, larry, curly); } else if (argc != 1) { fprintf (stderr, "Syntax: erisdate [month day year]\n\tAll hail Discordia! Blessed be.\a\n"); exit (1); } else { t = time (NULL); eris = localtime (&t); bob = eris->tm_yday; /* days since Jan 1. */ raw = eris->tm_year; /* years since 1980 */ hastur = convert (bob, raw); } print (hastur, argv); exit (0); } /* main() */ struct disc_time makeday (int imonth, int iday, int iyear) /*i for input */ { struct disc_time this; int cal[2][12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int dayspast = 0; imonth--; this.year = iyear + 1166; while (imonth > 0) { dayspast += cal[(this.year % 4) == 2 ? 1 : 0][--imonth]; } this.day = dayspast + iday - 1; this.season = 0; if ((this.year % 4) == 2) { if (this.day == 59) this.day = -1; else if (this.day > 59) this.day -= 1; } this.yday = this.day; while (this.day >= 73) { this.season++; this.day -= 73; } return this; } /* makeday() */ char * ending (int num) { int temp; char *this; this = (char *) malloc (sizeof (char) * 3); switch (num) /* 11th, 12th, 13th */ { case 11: case 12: case 13: strcpy (this, "th"); return this; } /* or do the main thing */ temp = num % 10; /* get 0-9 */ switch (temp) { case 1: strcpy (this, "st"); break; case 2: strcpy (this, "nd"); break; case 3: strcpy (this, "rd"); break; default: strcpy (this, "th"); } return this; } /* ending() */ struct disc_time convert (int nday, int nyear) { struct disc_time this; this.year = nyear + 3066; this.day = nday; this.season = 0; if ((this.year % 4) == 2) { if (this.day == 59) this.day = -1; else if (this.day > 59) this.day -= 1; } this.yday = this.day; while (this.day >= 73) { this.season++; this.day -= 73; } return this; } /* convert() */ void print (struct disc_time tick, char **args) { char *days[5] = { "Sweetmorn", "Boomtime", "Pungenday", "Prickle-Prickle", "Setting Orange" }; char *seasons[5] = { "Chaos", "Discord", "Confusion", "Bureaucracy", "The Aftermath" }; char *holidays[5][2] = { "Mungday!", "Chaoflux!", "Mojoday!", "Discoflux!", "Syaday!", "Confuflux!", "Zaraday!", "Bureflux!", "Maladay!", "Afflux!" }; if (args[1] != NULL) printf ("%s-%s-%s is ", args[1], args[2], args[3]); if (tick.day == -1) printf ("\tSt. Tib's Day!"); else { tick.day++; printf ("%s", days[tick.yday % 5]); printf (", %d", tick.day); printf ("%s day of %s", ending (tick.day), seasons[tick.season]); } printf (", YOLD %d\n", tick.year); if ((tick.day == 5) || (tick.day == 50)) { printf (" - Celebrate "); if (tick.day == 5) printf ("%s\n", holidays[tick.season][0]); else printf ("%s\n", holidays[tick.season][1]); } } /* print() */ /* $Id: erisdate.c,v 1.11 2004/02/29 08:42:13 johnny Exp $ */