DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T c

⟦296be2d30⟧ TextFile

    Length: 6630 (0x19e6)
    Types: TextFile
    Names: »cursive.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Cursive/cursive.c« 

TextFile

/*		CURSIVE SIGNATURE PROGRAM		Version 0.10
 *              (c) 1985 - Jan Wolter
 *
 *  Purpose:	This program translates text into crude cursive script.
 *		It works on any terminal with a fairly normal character
 *		set (must have backslashes and underscores and suchlike).
 *		The font includes all upper and lower case letters, most
 *		punctuation, and a few symbols.  No numbers are included
 *		(It's difficult to make a nice italicized set of numbers).
 *		Cursive was originally written to generate fancy signatures
 *		for electronic mail messages, but other uses may occur to
 *		you.  The attractiveness of the font varies greatly with
 *		the display device.
 *
 *  Usage:	If no command line arguments are given, cursive reads the
 *		text to translate from standard input.  Otherwise the args
 *		are translated (e.g. "cursive Jan Wolter" prints my name).
 *		Output is always to standard output.  A couple command line
 *		arguments are recognized:
 *
 *		  -in	Sets the amount of space to insert between letters.
 *			The default is "-i1".  "-i0" gives interesting
 *			results.
 *		  -tn	Sets the length of the trailing line off the end
 *			of each word.  The default is "-t1".
 *
 *		One character in the text is treated in a special way:
 *
 *		  '_'   Can be inserted in text to slightly lengthen the
 *			the spacing between two letters, or add a longer
 *			tail to the end of a word.
 *
 *  Internals:	Unfortunately, the program is a kludge and the font is
 *		somewhat difficult to edit.  It should be easy to port
 *		though.  Systems with short integers or unsigned characters
 *		should be no problem.  You should probably run "xstr" on the
 *		font.c file, but if you haven't got "xstr", just compiling it
 *		the usual way works fine.
 *
 *  Copyright:	Both the cursive program and the font it generates are
 *		copyrighted by yours truly.  However, both may be used
 *		and distributed freely.  You even have my permission to
 *		sell it, or include in it a system that you sell.  I only
 *		ask that my name be retained on this program, or any direct
 *		decendents of this program with approximately the same
 *		visibility as in this posting.
 *
 *  Mail:	I'm interested in any comments you have on this program.
 *		I can be mailed at "janc@crim.eecs.umich.edu".  Better yet,
 *		if you are into teleconferencing, call M-Net at (313) 994-6333
 *		and type "newuser" at the "login:" prompt to give yourself an
 *		account.  Send mail to janc, or join the "ugames" conference.
 *
 *		Have fun,
 *				  ___                _     __  _
 *				 (   >              ' )   /   // _/_
 *				  __/___.  ____      / / / __|/  /  _  __
 *				 / / (_/|_/ / <__   (_(_/ (_) \_<__</_/ (__
 *				<_/
 */

#include <stdio.h>
#include "cursive.h"

char *buffer[6];	/* memory buffers to build up line in */
int c[6];		/* current index in each of the buffer lines */
int tail[6];		/* which buffer lines have tails in them */
int lasttail;		/* which line was the last letter's tail */
int space;		/* how much white space before the next letter */
int interspace = 1;	/* how much to spread adjacent letters out */
int taillen = 1;	/* how long the tails on ends of words should be */
char firstletter;	/* is this the first letter on the line? */
char message[256] = "";	/* message to print */

char *malloc();

main(argc,argv)
int argc;
char **argv;
{
int i;
char *s,*m;
char ch;

	m = message;
	for (i = 1; i < argc; i++)
	{
		if (*argv[i] == '-')
			switch(ch = argv[i][1])
			{
			case 'i':
			case 't':
				s = argv[i]+2;
				if (*s == '\000')
					if (++i < argc)
						s = argv[i];
				if (*s < '0' || *s > '9')
				{
					printf("%s: Illegal value %s\n",
						argv[0],s);
					exit(1);
				}
				if (ch == 'i')
					interspace = atoi(s);
				else
					taillen = atoi(s);
				break;
			default:
				printf("usage: %s [-tn] [-in] message\n",
					argv[0]);
				exit(1);
			}
		else
		{
			if (m != message)
				*(m++) = ' ';
			for (s=argv[i]; *s != '\000'; s++)
				*(m++) = *s;
		}
	}
	/* Do the deed */
	if (m != message)
	{
		/* Message from the arg list */
		*(m++) = 0;
		prline(message);
	}
	else
	{
		/* Message from standard input */
		while (gets(message) != NULL)
			prline(message);
	}
}


/* Add the given letter to the end of the current line */

place(let)
struct letter *let;
{
int i,j,n;
int col;
int max = -10000;
char pad;
char *l;

	if (firstletter)
	{
		col = space;		/* Leading spaces */
		firstletter = 0;
	}
	else
	{
		/* Find the furthest left position we can place this letter */
		for(i=0; i<6; i++)
		{
			if (let->line[i][0] != '\000' &&
			    (col = c[i] - let->spcs[i]) > max)
				max = col;
		}

		/* Insert some spaces between letters */
		col = max + space + interspace;
	}

	for(i=0; i<6; i++)

		/* If Nothing on this Line, Skip It */
		if (let->line[i][0] != '\000')
		{
			/* Number of Spaces to Put on this Line? */
			n = col - c[i] + let->spcs[i];

			/* Flyers off Ends of Letters */
			if (tail[i])
				for (j = 0;
				     j < 5 && n > space + 2; j++,n--)
					buffer[i][c[i]++] = '_';

			/* Connecting Lines Between Letters */
			pad = (lasttail == i && let->tailin == i) ? '_' : ' ';

			/* In the middle of the intersection of South and */
			/* East University, someone is playing the piano. */
			for ( ; n > 0; n--)
				buffer[i][c[i]++] = pad;

			/* Copy in the letter text */
			for (l = let->line[i]; *l != '\000'; l++)
				buffer[i][c[i]++] = *l;

			tail[i] = (i == let->tailout);
		}

	lasttail = let->tailout;
	space = 0;
}

/* Lengthen the last trailer by n */
tailer(n)
int n;
{
int j;
	if (lasttail >= 0)
		for (j = 0; j < n; j++)
			buffer[lasttail][c[lasttail]++] = '_';
}

/* Handle a line */
prline(s)
char *s;
{
int l,i;
char *ch;
short lcode;

	lasttail = -1;
	firstletter = 1;
	space = 0;
	/* Get some memory to put the output into */
	l = strlen(s) * (CHARWIDTH + interspace);
	for (i=0;i<6;i++)
	{
		buffer[i] = malloc((unsigned)l);
		tail[i] = c[i] = 0;
	}

	/* do each letter */
	for (ch=s; *ch != '\000'; ch++)
	{

		*ch &= '\177';
		/* Find the letter */
		lcode = (lasttail != 2) ? code1[*ch] : code2[*ch];
		if (lcode >= 0)
			place(&list[lcode]);
		else
			/* Various Special characters */
			switch(lcode)
			{
			case SP:
				/* Insert white space before next letter */
				tailer(taillen);
				space += 3;
				lasttail = -1;
				break;
			case ST:
				/* Lengthen the last tail */
				if (lasttail >= 0)
					buffer[lasttail][c[lasttail]++] = '_';
				break;
			}
	}
	tailer(taillen);

	/* print the line and release the memory */
	for (i=0;i<6;i++)
	{
		buffer[i][c[i]++] = '\n';
		write(1,buffer[i],c[i]);
		free(buffer[i]);
	}
}