[alt.sources] Plan'

rosenber@ra.abo.fi (Robin Rosenberg INF) (09/14/89)

A .plan file is created with a text editor that allows you to insert terminal
control codes. There was a time two-three years ago here when everybody tried
to have the most advanced plan file. There was everything from simple scrolling
text to redefinition of character sets with smooth scroll. I think almost 
every trick a Televideo Vt220 terminal could do was exploited. The most
advanced .plan file I saw lasted some two-three minutes.... 
  The problem was that if you had a vt52 terminal it would lock up. The 
.plan-war ended by itself, mostly because it was a waste of time to create 
those plan files. 

  For the one that asked: .plan files are used on VMS and UNIX systems. 
Typically they contain the user's address, telephone numbers and other 
information the user want to make available to other. I.e your not suppose
to have animations and such garbage in it. Typically you get at the plan file
with a command like FINGER username.

 BTW, you could create very nice typeset plan files using TeX and a previewer.
Of course, people will be annoyed since they have a terminal which is 
incompatible with the control codes in you .plan file.

Robin Rosenberg

kevin@ttidca.TTI.COM (Kevin Carothers) (09/15/89)

In article <151@ra.abo.fi> rosenber@ra.abo.fi (Robin Rosenberg INF) writes:
>A .plan file is created with a text editor that allows you to insert terminal
>control codes. There was a time two-three years ago here when everybody tried
>to have the most advanced plan file. There was everything from simple scrolling
>text to redefinition of character sets with smooth scroll. I think almost 
 [---]
>  For the one that asked: .plan files are used on VMS and UNIX systems. 
>Typically they contain the user's address, telephone numbers and other 
>information the user want to make available to other. I.e your not suppose
>to have animations and such garbage in it. Typically you get at the plan file
>with a command like FINGER username.
 [---]

 There seems to be quite a plethora of postings about .plans. Since enough
 interest seems to be out there, I am posting the "dotplan.c" program that
 was plunked into alt.s  over a year ago.

BTW
 Pardons if this is taking up too much bandwidth, but IMHO the time seems
 to be ripe for re-posting this.


---------C  U  T-----H  E  R  E-----------------------------------------
# This is a shell archive.  Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file".  (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# dotplan.c

echo x - dotplan.c
cat > "dotplan.c" << '//E*O*F dotplan.c//'
/*
 * dotplan.c - Program to generate interesting .plan files
 *
 * By Roger Murray (ucla-an!remsit!rem@ee.ucla.edu) and
 *    Marc Kriguer (kriguer@ernie.berkeley.edu)
 *
 * Last Update: Mon Oct 17 13:55:14 PDT 1988
 *
 * If you'd like to add algorithms to this program, please follow the
 * following guidelines:
 *
 * 1) Write them as functions passed a (char *) and returning an int.
 * 2) Don't use backspaces.  Some fingers translate them.
 * 3) Be careful with malloc().  Make sure strings are NULL-terminated.
 *    free() what you malloc().
 * 4) Send the function, its long name (for list[]), and an address
 *    (to give credit where credit is due) to one of us.  "Anon" is fine.
 */

#include <stdio.h>

/* REM */

int shift_right(string)
char *string;
{
   char *ptr;

   ptr = &string[strlen(string)-1];
   while(ptr >= string)
      {
         printf("%s\r", ptr);
         ptr--;
      }
   putchar('\n');
}

/* REM */

int shift_left(string)
char *string;
{
   int loop;

   for(loop = strlen(string)-1; loop >= 1; loop--)
      printf("%*s%.*s\r", loop, " ", strlen(string)-loop, string);
   printf("%s\n", string);
}

/* MDK */

int fill_right(string)
char *string;
{
   int i;

   for (i = 1; i <= strlen(string); i++)
      printf("%.*s\r", i, string);
   putchar('\n');
}

/* MDK */

int fill_left(string)
char *string;
{
   int i;

   for (i = 1; i < strlen(string) - 1; i++)
      printf("%*s%c\r", strlen(string)-i, " ", string[strlen(string)-i]);
   printf("%s\n", string);
}

/* MDK */

int ASCIIbet(string)
char *string;
{
   char *ptr;
   int i, j, flag;

   ptr = (char *) malloc(strlen(string)+1);
   sprintf(ptr, "%*s", strlen(string), " ");

   for (j = 1; j < 128; j++)
   {
      flag = 0;
      for (i = 0; i < strlen(string) ; i++)
         {
	    if (string[i] == j)
	    {
	       flag = 1;
	       ptr[i] = j;
            }
         }
      if (flag)
            printf("%s\r", ptr);
   }
   putchar('\n');
   free(ptr);
}

/* MDK */

int Robot_Attack(string)
char *string;
{
   char *ptr;
   int i, j, flag=0;

   ptr = (char *) malloc(strlen(string)+1);

   for (i = 0; i < strlen(string); i++)
   {
      ptr[i] = ' ';
      if (string[i] > flag)
	 flag = string[i];
      if (string[i] < 'a')		/* only one pass for lower case letters;
			                it took too long going from 32 to 127 */
	 ptr[i] = string[i];
   }

   ptr[strlen(string)] = '\0';

   for (j = 'a'; j <= flag; j++)
   {
      for (i = 0; i < strlen(string) ; i++)
         {
	    if (string[i] >= j)
	    {
	       ptr[i] = j;
            }
         }
      printf("%s\r", ptr);
   }
   putchar('\n');
   free(ptr);
}

/* REM */

int expand_out(string)
char *string;
{
   char *ptr;
   int loop, halfsize;

   if(strlen(string) % 2)
      {
         ptr = (char *) malloc(strlen(string)+2);
         sprintf(ptr, "%s ", string);
      }
   else
      ptr = string;
   for(loop = 1; loop <= (halfsize = strlen(ptr)/2)-1; loop++)
      printf("%*s%.*s%s%*s\r", halfsize-loop, " ", loop, ptr,
         &ptr[strlen(ptr)-1-loop], halfsize-loop, " ");
   printf("%s\n", ptr);
   if(ptr != string)
      free(ptr);
}

/* REM */

int expand_in(string)
char *string;
{
   char *ptr;
   int loop, halfsize;

   if(strlen(string) % 2)
      {
         ptr = (char *) malloc(strlen(string)+2);
         sprintf(ptr, "%s ", string);
      }
   else
      ptr = string;
   for(loop = 1; loop <= (halfsize = strlen(ptr)/2)-1; loop++)
      printf("%.*s%*s%.*s\r", loop, &ptr[halfsize-loop],
         2 * (halfsize-loop), " ", loop, &ptr[halfsize]);
   printf("%s\n", ptr);
   if(ptr != string)
      free(ptr);
}

/* MDK */

int merge_one(string)
char *string;
{
   char *ptr, *model;
   int loop, i, len=strlen(string);

   if(len % 2)
      {
         ptr = (char *) malloc(++len +1);
         sprintf(ptr, "%*s", len, " ");
         model = (char *) malloc(len +1);
         sprintf(model, "%s ", string);
      }
   else
      {
         ptr = (char *) malloc(len +1);
         sprintf(ptr, "%*s", len, " ");
         model = string;
      }

   for(loop = 0; loop < len/2; loop++)
   {
      for (i = 0; i <= loop; i++)
      {
         ptr[2*i] = model[len + 2*(i - loop -1)];
         ptr[len-1 - 2*i] = model[2*(loop - i) + 1];
      }
      printf ("%s\r", ptr); 
   }
   putchar('\n');
   free(ptr);
   if(model != string)
      free(model);
}

/* REM */

int bounce_right(string)
char *string;
{
   char *ptr, *backward;
   int loop, len = strlen(string);

   backward = (char *) malloc(len+1);
   for(loop = 0; loop < len; loop++)
      backward[len-1-loop] = string[loop];
   backward[len] = '\0';
   ptr = &backward[len-1];
   while(ptr >= backward)
      {
         printf("%s\r", ptr);
         ptr--;
      }
   ptr = (char *) malloc(len+1);
   for(loop = 1; loop < len; loop++)
      {
         sprintf(ptr, "%*s%.*s", loop, " ", len-loop, backward);
         sprintf(&ptr[len-loop], "%.*s", loop, string);
         printf("%s\r", ptr);
      }
   printf("%s\n", string);
   free(ptr);
   free(backward);
}

/* REM */

int bounce_left(string)
char *string;
{
   char *ptr, *backward, *from, *to;
   int loop, len = strlen(string);

   backward = (char *) malloc(len+1);
   for(loop = 0; loop < len; loop++)
      backward[len-1-loop] = string[loop];
   backward[len] = '\0';
   for(loop = len-1; loop >= 1; loop--)
      printf("%*s%.*s\r", loop, " ", len-loop, backward);
   printf("%s\r", backward);
   ptr = (char *) malloc(len+1);
   for(loop = 1; loop < len; loop++)
      {
         sprintf(ptr, "%s%*s", &backward[loop], loop, " ");
         from = &string[len-loop];
         to = ptr;
         while(*from != '\0')
            *to++ = *from++;
         printf("%s\r", ptr);
      }
   printf("%s\n", string);
   free(ptr);
   free(backward);
}

/* MDK */

#define swap(A,B)  temp = (A); (A) = (B); (B) = temp

int bubble(string)
char *string;
{
   char *ptr;
   int   i, j, temp, 
         swaps = 0,
         len = strlen(string),
         *indices = (int *) malloc(len * sizeof(int));

   ptr = (char *) malloc(len + 1);
   strcpy (ptr, string);

   for (i = 0; i < len; i++)
      indices[i] = i;

   for (i = 0; i <= len-2; i++)			/* first, bubble sort the */
      for (j = i+1; j <= len-1; j++)		/* string, to create an   */
	 if (ptr[i] > ptr[j])			/* array of indices that  */
	 {					/* correspond to our	  */
            swap(ptr[i], ptr[j]);		/* characters. */
	    swap(indices[i], indices[j]);
         }

   for (i = 0; i <= len-2; i++)			/* Now, bubble sort the   */
      for (j = i+1; j <= len-1; j++)		/* numbers back into      */
	 if (indices[i] > indices[j])		/* place to "unsort" the  */	
	 {					/* sorted letters into    */
	    printf ("%s\r", ptr);		/* out desired string.    */
            swap(ptr[i], ptr[j]);
	    swap(indices[i], indices[j]);
         }

   puts(ptr);
   free(ptr);
   free(indices);
}

/* REM */

int insert(string)
char *string;
{
   char *ptr, *load;
   int len = strlen(string),
       loop, *iptr, min = 255, max = 0,
       *pos = (int *) malloc(len * sizeof(int));

   ptr = (char *) malloc(len+1);
   for(loop = 0; loop < len; loop++)
      {
         pos[loop] = 0;
         if(string[loop] < min)
            min = string[loop];
         else
            if(string[loop] > max)
               max = string[loop];
      }
   for(; min <= max; min++)
      {
         for(loop = 0; loop < len; loop++)
            if(string[loop] == min)
               {
                  pos[loop] = 1;
                  load = ptr;
                  iptr = pos;
                  while(iptr <= &pos[len-1])
                     if (*iptr++)
                        *load++ = string[(iptr-1)-pos];
                  *load = '\0';
                  printf("%s\r", ptr);
               }
      }
   putchar('\n');
   free(ptr);
   free(pos);
}

typedef struct array_elem {
   char *name;
   int (*function)();
};

/*
 * Nick:    Address:
 * REM      ucla-an!remsit!rem@ee.ucla.edu
 * MDK      kriguer@ernie.berkeley.edu
 */

struct array_elem list[] = {

{ "Shift text to right", shift_right },     /* REM */
{ "Shift text to left", shift_left},        /* REM */
{ "Fill text to right", fill_right },       /* MDK */
{ "Fill text to left", fill_left },         /* MDK */
{ "Expand text outward", expand_out },      /* REM */
{ "Expand text inward", expand_in },        /* REM */
{ "Bounce text on right", bounce_right },   /* REM */
{ "Bounce text on left", bounce_left },     /* REM */
{ "Merge text inward", merge_one },         /* MDK */
{ "Un-Bubble Sort text", bubble },          /* MDK */
{ "Insertion Sort text", insert },          /* REM */
{ "Fill text ASCIIbetically", ASCIIbet },   /* MDK */
{ "Robot Attack technique", Robot_Attack }, /* MDK */

};

#define LISTSIZE sizeof(list) / sizeof(struct array_elem)

char *author[2] = { "Roger Murray (ucla-an!remsit!rem@ee.ucla.edu)",
                    "Marc Kriguer (kriguer@ernie.berkeley.edu)", };

main(argc, argv)
int argc;
char *argv[];
{
   int loop, style, arglen;
   char temp_string[80];
   char *textptr;

   if(argc < 3 && !(argc == 2 && argv[1][0] == 's'))
      {
         printf("Usage: %s [style|s|d] \"Text to display\"\n\n", argv[0]);
         printf("Styles:\n");
         for(loop = 0; loop < LISTSIZE; loop++)
            printf("   %2d. %s\n", loop+1, list[loop].name);
         printf("\ns = help with styles  :-)\n");
         printf("d = display in all styles\n");
         printf("\nBy: %s and\n    %s\n", author[getpid() % 2],
            author[!(getpid() % 2)]);
         exit(0);
      }
   if((style = atoi(argv[1])) == 0)
      switch(argv[1][0])
         {
            case 's': printf("Styles:\n");
                      for(loop = 0; loop < LISTSIZE; loop++)
                         {
                            sprintf(temp_string, "   %2d. %s", loop+1, list[loop].name);
                            (void) (*list[loop].function)(temp_string);
                         }
                      break;
            case 'd': arglen = 0;
                      for(loop = 2; loop < argc; loop++)
                         arglen += strlen(argv[loop]) + 1;
                      textptr = (char *) malloc(arglen);
                      *textptr = '\0';
                      for(loop = 2; loop < argc; loop++)
                         {
                            strcat(textptr, argv[loop]);
                            if(loop != argc-1)
                               strcat(textptr, " ");
                         }
                      for(loop = 0; loop < LISTSIZE; loop++)
                         (void) (*list[loop].function)(textptr);
                      break;
            default: printf("Huh? (bad letter)\n");
                     break;
         }
   else
      if(style >= 1 && style <= LISTSIZE+1)
         {
            arglen = 0;
            for(loop = 2; loop < argc; loop++)
               arglen += strlen(argv[loop]) + 1;
            textptr = (char *) malloc(arglen);
            *textptr = '\0';
            for(loop = 2; loop < argc; loop++)
               {
                  strcat(textptr, argv[loop]);
                  if(loop != argc-1)
                     strcat(textptr, " ");
               }
            (void) (*list[style-1].function)(textptr);
         }
      else
         printf("Huh? (bad style number)\n");
}
//E*O*F dotplan.c//

exit 0