home *** CD-ROM | disk | FTP | other *** search
- From: jbr0@cbnews.att.com (joseph.a.brownlee)
- Newsgroups: alt.sources
- Subject: Valentine Program
- Message-ID: <1991Feb13.211939.1547@cbnews.att.com>
- Date: 13 Feb 91 21:19:39 GMT
-
- 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
-