jbr0@cbnews.att.com (joseph.a.brownlee) (02/14/91)
I am posting this for a friend. The "Reply-To" line in the article is set to go to the author. Send all comments to him. > From: Andrew Rogers <uunet!hicomb!rogers%calamari> > > Here's a cute seasonal program I hacked many years ago. If you can possibly > post it to alt.sources before Valentine's Day, I'm sure lots of people will > enjoy it. > > Andrew ---------------------------- 8< cut here >8 ---------------------------------- /* * Valentine program * * prog <string1> <string2> ... * * generates repeating pattern of <stringN> to stdout in one of two designs * (see below). * * options: * * -H draw heart design (default) * -L draw Robert Indiana's "LOVE" design * -r shift successive lines to right (default) * -n do not shift successive lines * -l shift successive lines to left * * Author: A. W. Rogers, circa 1980 */ #define MAXSKIP 4 /* maximum # of skip pairs */ #define NSKIP (2 * MAXSKIP + 1) /* array dimension */ #define STRSIZ 200 /* string buffer size */ #define NONE { 0 } /* line has no skip pairs */ #define END -1 /* flag for last line */ #define LASTLINE { -1 } /* initializer for last line */ #define HEART 0 /* output designs */ #define LOVE 1 #define DEFAULT_DESIGN HEART #define NOSHIFT 0 /* direction of shifting */ #define RSHIFT 1 #define LSHIFT 2 #define DEFAULT_SHIFT RSHIFT #define FALSE 0 /* the usual... */ #define TRUE 1 /* initialization of fields to skip when drawing each type of design */ short skip_heart[][NSKIP] = { NONE, { 2, 59 }, { 2, 14, 21, 40, 47, 59 }, { 2, 11, 23, 38, 50, 59 }, { 2, 8, 26, 35, 53, 59 }, { 2, 6, 29, 33, 55, 59 }, { 2, 4, 30, 31, 57, 59 }, { 2, 3, 58, 59 }, { 2, 2, 59, 59 }, { 2, 2, 59, 59 }, { 2, 2, 59, 59 }, { 2, 2, 59, 59 }, { 2, 2, 59, 59 }, { 2, 2, 59, 59 }, { 2, 2, 59, 59 }, { 2, 3, 58, 59 }, { 2, 3, 58, 59 }, { 2, 4, 57, 59 }, { 2, 5, 56, 59 }, { 2, 5, 56, 59 }, { 2, 6, 55, 59 }, { 2, 7, 54, 59 }, { 2, 8, 53, 59 }, { 2, 10, 51, 59 }, { 2, 11, 50, 59 }, { 2, 12, 49, 59 }, { 2, 14, 47, 59 }, { 2, 16, 45, 59 }, { 2, 19, 42, 59 }, { 2, 21, 40, 59 }, { 2, 23, 38, 59 }, { 2, 25, 36, 59 }, { 2, 28, 33, 59 }, { 2, 29, 32, 59 }, { 2, 59 }, NONE, LASTLINE } ; short skip_love[][NSKIP] = { NONE , { 2, 13, 40, 48 }, { 4, 11, 36, 52 }, { 5, 10, 34, 54 }, { 5, 10, 33, 44, 50, 55 }, { 5, 10, 32, 42, 51, 56 }, { 5, 10, 32, 41, 52, 56 }, { 5, 10, 32, 40, 52, 56 }, { 5, 10, 32, 39, 51, 56 }, { 5, 10, 32, 38, 50, 56 }, { 5, 10, 32, 37, 49, 56 }, { 5, 10, 32, 36, 48, 56 }, { 5, 10, 30, 30, 32, 36, 47, 56 }, { 5, 10, 29, 30, 32, 37, 46, 56 }, { 5, 10, 28, 30, 32, 38, 44, 56 }, { 5, 10, 26, 30, 33, 55 }, { 2, 30, 36, 52 }, { 2, 30, 40, 48 }, { 2, 14, 20, 59 }, { 2, 14, 20, 59 }, { 5, 10, 24, 26, 37, 42, 55, 59 }, { 6, 11, 23, 25, 37, 42, 57, 59 }, { 6, 11, 23, 25, 37, 42, 58, 59 }, { 7, 12, 22, 24, 37, 42, 59, 59 }, { 7, 12, 22, 24, 37, 42, 50, 50 }, { 8, 13, 21, 23, 37, 42, 49, 50 }, { 8, 13, 21, 23, 37, 50 }, { 9, 14, 20, 22, 37, 42, 49, 50 }, { 9, 14, 20, 22, 37, 42, 50, 50 }, { 10, 15, 19, 21, 37, 42, 59, 59 }, { 10, 15, 19, 21, 37, 42, 58, 59 }, { 11, 16, 18, 20, 37, 42, 57, 59 }, { 11, 20, 37, 42, 55, 59 }, { 12, 19, 33, 59 }, { 12, 19, 33, 59 }, NONE , LASTLINE } ; struct { short (*lineskip)[NSKIP]; /* ptr to one of above arrays */ int width; /* width of design */ } design_info[] = { skip_heart, 60, /* HEART */ skip_love, 60 /* LOVE */ }; void initstr(str, text, width, off) /* set up output string */ char *str; char *text; int width; int off; { off %= strlen(text); strcpy(str, text+off); while (strlen(str) < width) strcat(str, text); str[width] = '\0'; } main(argc, argv) int argc; char **argv; { char str[STRSIZ], *parg; int i, off, incr; int first = TRUE; int design = DEFAULT_DESIGN, direction = DEFAULT_SHIFT; short (*ppskip)[NSKIP]; short *pskip; while (parg = *++argv) { if (*parg == '-') { /* get option */ switch(*++parg) { case 'L': design = LOVE; break; case 'H': design = HEART; break; case 'l': direction = LSHIFT; break; case 'r': direction = RSHIFT; break; case 'n': direction = NOSHIFT; break; } continue; } if (*parg == '\0') /* skip null args */ continue; if (!first) /* print design for arg */ printf("\f\n"); /* <FF> between designs */ first = FALSE; incr = direction == NOSHIFT ? 0 : direction == LSHIFT ? 1 : strlen(parg) - 1; for (off = 0, ppskip = design_info[design].lineskip; *(pskip = (short *)ppskip) != END; off += incr, ppskip++) { initstr(str, parg, design_info[design].width, off); for ( ; pskip[0]; pskip += 2) for (i = pskip[0]; i <= pskip[1]; i++) str[i-1] = ' '; printf("\t%s\n", str); } } } -- - _ Joe Brownlee, Analysts International Corp. @ AT&T Network Systems /_\ @ / ` 471 E Broad St, Suite 1610, Columbus, Ohio 43215 (614) 860-7461 / \ | \_, E-mail: jbr@cblph.att.com Who pays attention to what _I_ say? "Scotty, we need warp drive in 3 minutes or we're all dead!" --- James T. Kirk