home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / compsrcs / misc / volume05 / dotplan < prev    next >
Encoding:
Internet Message Format  |  1991-08-27  |  15.6 KB

  1. From decwrl!labrea!rutgers!ukma!cwjcc!hal!ncoast!allbery Mon Nov  7 19:23:21 PST 1988
  2. Article 708 of comp.sources.misc:
  3. Path: granite!decwrl!labrea!rutgers!ukma!cwjcc!hal!ncoast!allbery
  4. From: rem@remsit.UUCP (Roger Murray)
  5. Newsgroups: comp.sources.misc
  6. Subject: v05i032: dotplan - Program to generate interesting .plan files
  7. Message-ID: <518@remsit.UUCP>
  8. Date: 6 Nov 88 20:17:11 GMT
  9. Sender: allbery@ncoast.UUCP
  10. Reply-To: rem@remsit.UUCP (Roger Murray)
  11. Organization: REM's IT, Santa Monica, CA
  12. Lines: 574
  13. Approved: allbery@ncoast.UUCP
  14.  
  15. Posting-number: Volume 5, Issue 32
  16. Submitted-by: "Roger Murray" <rem@remsit.UUCP>
  17. Archive-name: dotplan
  18.  
  19. [It works and seems to contain no system dependencies.  Except that it uses
  20. a few long identifiers (expand_* and bounce_*).  ++bsa]
  21.  
  22. #    This is a shell archive.
  23. #    Remove everything above and including the cut line.
  24. #    Then run the rest of the file through sh.
  25. #----cut here-----cut here-----cut here-----cut here----#
  26. #!/bin/sh
  27. # shar:    Shell Archiver
  28. #    Run the following text with /bin/sh to create:
  29. #    Makefile
  30. #    dotplan.1
  31. #    dotplan.c
  32. # This archive created: Fri Oct 28 22:42:37 1988
  33. # By:    Roger Murray (REM's IT)
  34. echo shar: extracting Makefile
  35. sed 's/^XX//' << \SHAR_EOF > Makefile
  36. XXBINDIR = /usr/local/bin
  37. XX
  38. XXdotplan: dotplan.c
  39. XX    cc -s -o dotplan dotplan.c
  40. XX
  41. XXinstall: dotplan
  42. XX    mv dotplan $(BINDIR)
  43. SHAR_EOF
  44. if test 112 -ne "`wc -c Makefile`"
  45. then
  46. echo shar: error transmitting Makefile '(should have been 112 characters)'
  47. fi
  48. echo shar: extracting dotplan.1
  49. sed 's/^XX//' << \SHAR_EOF > dotplan.1
  50. XX.TH DOTPLAN 1
  51. XX.SH NAME
  52. XXdotplan \- Generate interesting .plan files
  53. XX.SH SYNOPSIS
  54. XX.B dotplan
  55. XX[
  56. XX.I style
  57. XX| s | d ]
  58. XX.I text
  59. XX.SH DESCRIPTION
  60. XX.I dotplan
  61. XXtakes the supplied text (optionally between quotes to reduce the possibility
  62. XXof conflict with a shell metacharater) and displays it in one of many ways.
  63. XXThe results can be redirected (via '>') to the user's
  64. XX.I .plan
  65. XXfile.
  66. XX.PP
  67. XXThe meanings of the options are:
  68. XX.TP 6
  69. XX.B style
  70. XXtells
  71. XX.I dotplan
  72. XXto display the given text in one of its many styles.
  73. XX.TP 6
  74. XX.B s
  75. XXdisplays the list of styles, using each style on its description.  It's
  76. XXnice to be able to compare various styles and it helps when the user
  77. XXcan't think of anything to display.
  78. XX.TP 6
  79. XX.B d
  80. XXdisplays the given text in all styles, one at a time.
  81. XX.SH EXAMPLES
  82. XX.nf
  83. XXdotplan 3 This is sample text # Display string using style 3
  84. XXdotplan                       # Display usage information
  85. XXdotplan s                     # Display styles in all styles
  86. XXdotplay d This is more text   # Display string in all styles
  87. XX.fi
  88. XX.SH AUTHORS
  89. XX.nf
  90. XXRoger Murray <rem@remsit.UUCP>
  91. XXMarc Kriguer <kriguer@ernie.bekeley.edu>
  92. XX.fi
  93. XX.SH DIAGNOSTICS
  94. XX"Huh? (bad style number)" means the user has tried to select a style that
  95. XXdoesn't exist.  "Huh? (bad letter)" means the user has chosen an option
  96. XXthat doesn't exist.
  97. XX.SH BUGS
  98. XXThe resulting
  99. XX.I .plan
  100. XXfiles can look pretty nice.  However, people using high speed terminals
  101. XX(terminals on cluster lines, Xenix consoles, etc.) won't really get the full
  102. XXeffect when viewing them.  I suppose there are worse things in the world.
  103. XX.SH SEE ALSO
  104. XXfinger(1)
  105. XXrn(1)
  106. XXwarp(6)
  107. SHAR_EOF
  108. if test 1572 -ne "`wc -c dotplan.1`"
  109. then
  110. echo shar: error transmitting dotplan.1 '(should have been 1572 characters)'
  111. fi
  112. echo shar: extracting dotplan.c
  113. sed 's/^XX//' << \SHAR_EOF > dotplan.c
  114. XX/*
  115. XX * dotplan.c - Program to generate interesting .plan files
  116. XX *
  117. XX * By Roger Murray (ucla-an!remsit!rem@ee.ucla.edu) and
  118. XX *    Marc Kriguer (kriguer@ernie.berkeley.edu)
  119. XX *
  120. XX * Last Update: Mon Oct 17 13:55:14 PDT 1988
  121. XX *
  122. XX * If you'd like to add algorithms to this program, please follow the
  123. XX * following guidelines:
  124. XX *
  125. XX * 1) Write them as functions passed a (char *) and returning an int.
  126. XX * 2) Don't use backspaces.  Some fingers translate them.
  127. XX * 3) Be careful with malloc().  Make sure strings are NULL-terminated.
  128. XX *    free() what you malloc().
  129. XX * 4) Send the function, its long name (for list[]), and an address
  130. XX *    (to give credit where credit is due) to one of us.  "Anon" is fine.
  131. XX */
  132. XX
  133. XX#include <stdio.h>
  134. XX
  135. XX/* REM */
  136. XX
  137. XXint shift_right(string)
  138. XXchar *string;
  139. XX{
  140. XX   char *ptr;
  141. XX
  142. XX   ptr = &string[strlen(string)-1];
  143. XX   while(ptr >= string)
  144. XX      {
  145. XX         printf("%s\r", ptr);
  146. XX         ptr--;
  147. XX      }
  148. XX   putchar('\n');
  149. XX}
  150. XX
  151. XX/* REM */
  152. XX
  153. XXint shift_left(string)
  154. XXchar *string;
  155. XX{
  156. XX   int loop;
  157. XX
  158. XX   for(loop = strlen(string)-1; loop >= 1; loop--)
  159. XX      printf("%*s%.*s\r", loop, " ", strlen(string)-loop, string);
  160. XX   printf("%s\n", string);
  161. XX}
  162. XX
  163. XX/* MDK */
  164. XX
  165. XXint fill_right(string)
  166. XXchar *string;
  167. XX{
  168. XX   int i;
  169. XX
  170. XX   for (i = 1; i <= strlen(string); i++)
  171. XX      printf("%.*s\r", i, string);
  172. XX   putchar('\n');
  173. XX}
  174. XX
  175. XX/* MDK */
  176. XX
  177. XXint fill_left(string)
  178. XXchar *string;
  179. XX{
  180. XX   int i;
  181. XX
  182. XX   for (i = 1; i < strlen(string) - 1; i++)
  183. XX      printf("%*s%c\r", strlen(string)-i, " ", string[strlen(string)-i]);
  184. XX   printf("%s\n", string);
  185. XX}
  186. XX
  187. XX/* MDK */
  188. XX
  189. XXint ASCIIbet(string)
  190. XXchar *string;
  191. XX{
  192. XX   char *ptr;
  193. XX   int i, j, flag;
  194. XX
  195. XX   ptr = (char *) malloc(strlen(string)+1);
  196. XX   sprintf(ptr, "%*s", strlen(string), " ");
  197. XX
  198. XX   for (j = 1; j < 128; j++)
  199. XX   {
  200. XX      flag = 0;
  201. XX      for (i = 0; i < strlen(string) ; i++)
  202. XX         {
  203. XX        if (string[i] == j)
  204. XX        {
  205. XX           flag = 1;
  206. XX           ptr[i] = j;
  207. XX            }
  208. XX         }
  209. XX      if (flag)
  210. XX            printf("%s\r", ptr);
  211. XX   }
  212. XX   putchar('\n');
  213. XX   free(ptr);
  214. XX}
  215. XX
  216. XX/* MDK */
  217. XX
  218. XXint Robot_Attack(string)
  219. XXchar *string;
  220. XX{
  221. XX   char *ptr;
  222. XX   int i, j, flag=0;
  223. XX
  224. XX   ptr = (char *) malloc(strlen(string)+1);
  225. XX
  226. XX   for (i = 0; i < strlen(string); i++)
  227. XX   {
  228. XX      ptr[i] = ' ';
  229. XX      if (string[i] > flag)
  230. XX     flag = string[i];
  231. XX      if (string[i] < 'a')        /* only one pass for lower case letters;
  232. XX                            it took too long going from 32 to 127 */
  233. XX     ptr[i] = string[i];
  234. XX   }
  235. XX
  236. XX   ptr[strlen(string)] = '\0';
  237. XX
  238. XX   for (j = 'a'; j <= flag; j++)
  239. XX   {
  240. XX      for (i = 0; i < strlen(string) ; i++)
  241. XX         {
  242. XX        if (string[i] >= j)
  243. XX        {
  244. XX           ptr[i] = j;
  245. XX            }
  246. XX         }
  247. XX      printf("%s\r", ptr);
  248. XX   }
  249. XX   putchar('\n');
  250. XX   free(ptr);
  251. XX}
  252. XX
  253. XX/* REM */
  254. XX
  255. XXint expand_out(string)
  256. XXchar *string;
  257. XX{
  258. XX   char *ptr;
  259. XX   int loop, halfsize;
  260. XX
  261. XX   if(strlen(string) % 2)
  262. XX      {
  263. XX         ptr = (char *) malloc(strlen(string)+2);
  264. XX         sprintf(ptr, "%s ", string);
  265. XX      }
  266. XX   else
  267. XX      ptr = string;
  268. XX   for(loop = 1; loop <= (halfsize = strlen(ptr)/2)-1; loop++)
  269. XX      printf("%*s%.*s%s%*s\r", halfsize-loop, " ", loop, ptr,
  270. XX         &ptr[strlen(ptr)-1-loop], halfsize-loop, " ");
  271. XX   printf("%s\n", ptr);
  272. XX   if(ptr != string)
  273. XX      free(ptr);
  274. XX}
  275. XX
  276. XX/* REM */
  277. XX
  278. XXint expand_in(string)
  279. XXchar *string;
  280. XX{
  281. XX   char *ptr;
  282. XX   int loop, halfsize;
  283. XX
  284. XX   if(strlen(string) % 2)
  285. XX      {
  286. XX         ptr = (char *) malloc(strlen(string)+2);
  287. XX         sprintf(ptr, "%s ", string);
  288. XX      }
  289. XX   else
  290. XX      ptr = string;
  291. XX   for(loop = 1; loop <= (halfsize = strlen(ptr)/2)-1; loop++)
  292. XX      printf("%.*s%*s%.*s\r", loop, &ptr[halfsize-loop],
  293. XX         2 * (halfsize-loop), " ", loop, &ptr[halfsize]);
  294. XX   printf("%s\n", ptr);
  295. XX   if(ptr != string)
  296. XX      free(ptr);
  297. XX}
  298. XX
  299. XX/* MDK */
  300. XX
  301. XXint merge_one(string)
  302. XXchar *string;
  303. XX{
  304. XX   char *ptr, *model;
  305. XX   int loop, i, len=strlen(string);
  306. XX
  307. XX   if(len % 2)
  308. XX      {
  309. XX         ptr = (char *) malloc(++len +1);
  310. XX         sprintf(ptr, "%*s", len, " ");
  311. XX         model = (char *) malloc(len +1);
  312. XX         sprintf(model, "%s ", string);
  313. XX      }
  314. XX   else
  315. XX      {
  316. XX         ptr = (char *) malloc(len +1);
  317. XX         sprintf(ptr, "%*s", len, " ");
  318. XX         model = string;
  319. XX      }
  320. XX
  321. XX   for(loop = 0; loop < len/2; loop++)
  322. XX   {
  323. XX      for (i = 0; i <= loop; i++)
  324. XX      {
  325. XX         ptr[2*i] = model[len + 2*(i - loop -1)];
  326. XX         ptr[len-1 - 2*i] = model[2*(loop - i) + 1];
  327. XX      }
  328. XX      printf ("%s\r", ptr); 
  329. XX   }
  330. XX   putchar('\n');
  331. XX   free(ptr);
  332. XX   if(model != string)
  333. XX      free(model);
  334. XX}
  335. XX
  336. XX/* REM */
  337. XX
  338. XXint bounce_right(string)
  339. XXchar *string;
  340. XX{
  341. XX   char *ptr, *backward;
  342. XX   int loop, len = strlen(string);
  343. XX
  344. XX   backward = (char *) malloc(len+1);
  345. XX   for(loop = 0; loop < len; loop++)
  346. XX      backward[len-1-loop] = string[loop];
  347. XX   backward[len] = '\0';
  348. XX   ptr = &backward[len-1];
  349. XX   while(ptr >= backward)
  350. XX      {
  351. XX         printf("%s\r", ptr);
  352. XX         ptr--;
  353. XX      }
  354. XX   ptr = (char *) malloc(len+1);
  355. XX   for(loop = 1; loop < len; loop++)
  356. XX      {
  357. XX         sprintf(ptr, "%*s%.*s", loop, " ", len-loop, backward);
  358. XX         sprintf(&ptr[len-loop], "%.*s", loop, string);
  359. XX         printf("%s\r", ptr);
  360. XX      }
  361. XX   printf("%s\n", string);
  362. XX   free(ptr);
  363. XX   free(backward);
  364. XX}
  365. XX
  366. XX/* REM */
  367. XX
  368. XXint bounce_left(string)
  369. XXchar *string;
  370. XX{
  371. XX   char *ptr, *backward, *from, *to;
  372. XX   int loop, len = strlen(string);
  373. XX
  374. XX   backward = (char *) malloc(len+1);
  375. XX   for(loop = 0; loop < len; loop++)
  376. XX      backward[len-1-loop] = string[loop];
  377. XX   backward[len] = '\0';
  378. XX   for(loop = len-1; loop >= 1; loop--)
  379. XX      printf("%*s%.*s\r", loop, " ", len-loop, backward);
  380. XX   printf("%s\r", backward);
  381. XX   ptr = (char *) malloc(len+1);
  382. XX   for(loop = 1; loop < len; loop++)
  383. XX      {
  384. XX         sprintf(ptr, "%s%*s", &backward[loop], loop, " ");
  385. XX         from = &string[len-loop];
  386. XX         to = ptr;
  387. XX         while(*from != '\0')
  388. XX            *to++ = *from++;
  389. XX         printf("%s\r", ptr);
  390. XX      }
  391. XX   printf("%s\n", string);
  392. XX   free(ptr);
  393. XX   free(backward);
  394. XX}
  395. XX
  396. XX/* MDK */
  397. XX
  398. XX#define swap(A,B)  temp = (A); (A) = (B); (B) = temp
  399. XX
  400. XXint bubble(string)
  401. XXchar *string;
  402. XX{
  403. XX   char *ptr;
  404. XX   int   i, j, temp, 
  405. XX         swaps = 0,
  406. XX         len = strlen(string),
  407. XX         *indices = (int *) malloc(len * sizeof(int));
  408. XX
  409. XX   ptr = (char *) malloc(len + 1);
  410. XX   strcpy (ptr, string);
  411. XX
  412. XX   for (i = 0; i < len; i++)
  413. XX      indices[i] = i;
  414. XX
  415. XX   for (i = 0; i <= len-2; i++)            /* first, bubble sort the */
  416. XX      for (j = i+1; j <= len-1; j++)        /* string, to create an   */
  417. XX     if (ptr[i] > ptr[j])            /* array of indices that  */
  418. XX     {                    /* correspond to our      */
  419. XX            swap(ptr[i], ptr[j]);        /* characters. */
  420. XX        swap(indices[i], indices[j]);
  421. XX         }
  422. XX
  423. XX   for (i = 0; i <= len-2; i++)            /* Now, bubble sort the   */
  424. XX      for (j = i+1; j <= len-1; j++)        /* numbers back into      */
  425. XX     if (indices[i] > indices[j])        /* place to "unsort" the  */    
  426. XX     {                    /* sorted letters into    */
  427. XX        printf ("%s\r", ptr);        /* out desired string.    */
  428. XX            swap(ptr[i], ptr[j]);
  429. XX        swap(indices[i], indices[j]);
  430. XX         }
  431. XX
  432. XX   puts(ptr);
  433. XX   free(ptr);
  434. XX   free(indices);
  435. XX}
  436. XX
  437. XX/* REM */
  438. XX
  439. XXint insert(string)
  440. XXchar *string;
  441. XX{
  442. XX   char *ptr, *load;
  443. XX   int len = strlen(string),
  444. XX       loop, *iptr, min = 255, max = 0,
  445. XX       *pos = (int *) malloc(len * sizeof(int));
  446. XX
  447. XX   ptr = (char *) malloc(len+1);
  448. XX   for(loop = 0; loop < len; loop++)
  449. XX      {
  450. XX         pos[loop] = 0;
  451. XX         if(string[loop] < min)
  452. XX            min = string[loop];
  453. XX         else
  454. XX            if(string[loop] > max)
  455. XX               max = string[loop];
  456. XX      }
  457. XX   for(; min <= max; min++)
  458. XX      {
  459. XX         for(loop = 0; loop < len; loop++)
  460. XX            if(string[loop] == min)
  461. XX               {
  462. XX                  pos[loop] = 1;
  463. XX                  load = ptr;
  464. XX                  iptr = pos;
  465. XX                  while(iptr <= &pos[len-1])
  466. XX                     if (*iptr++)
  467. XX                        *load++ = string[(iptr-1)-pos];
  468. XX                  *load = '\0';
  469. XX                  printf("%s\r", ptr);
  470. XX               }
  471. XX      }
  472. XX   putchar('\n');
  473. XX   free(ptr);
  474. XX   free(pos);
  475. XX}
  476. XX
  477. XXtypedef struct array_elem {
  478. XX   char *name;
  479. XX   int (*function)();
  480. XX};
  481. XX
  482. XX/*
  483. XX * Nick:    Address:
  484. XX * REM      ucla-an!remsit!rem@ee.ucla.edu
  485. XX * MDK      kriguer@ernie.berkeley.edu
  486. XX */
  487. XX
  488. XXstruct array_elem list[] = {
  489. XX
  490. XX{ "Shift text to right", shift_right },     /* REM */
  491. XX{ "Shift text to left", shift_left},        /* REM */
  492. XX{ "Fill text to right", fill_right },       /* MDK */
  493. XX{ "Fill text to left", fill_left },         /* MDK */
  494. XX{ "Expand text outward", expand_out },      /* REM */
  495. XX{ "Expand text inward", expand_in },        /* REM */
  496. XX{ "Bounce text on right", bounce_right },   /* REM */
  497. XX{ "Bounce text on left", bounce_left },     /* REM */
  498. XX{ "Merge text inward", merge_one },         /* MDK */
  499. XX{ "Un-Bubble Sort text", bubble },          /* MDK */
  500. XX{ "Insertion Sort text", insert },          /* REM */
  501. XX{ "Fill text ASCIIbetically", ASCIIbet },   /* MDK */
  502. XX{ "Robot Attack technique", Robot_Attack }, /* MDK */
  503. XX
  504. XX};
  505. XX
  506. XX#define LISTSIZE sizeof(list) / sizeof(struct array_elem)
  507. XX
  508. XXchar *author[2] = { "Roger Murray (ucla-an!remsit!rem@ee.ucla.edu)",
  509. XX                    "Marc Kriguer (kriguer@ernie.berkeley.edu)", };
  510. XX
  511. XXmain(argc, argv)
  512. XXint argc;
  513. XXchar *argv[];
  514. XX{
  515. XX   int loop, style, arglen;
  516. XX   char temp_string[80];
  517. XX   char *textptr;
  518. XX
  519. XX   if(argc < 3 && !(argc == 2 && argv[1][0] == 's'))
  520. XX      {
  521. XX         printf("Usage: %s [style|s|d] \"Text to display\"\n\n", argv[0]);
  522. XX         printf("Styles:\n");
  523. XX         for(loop = 0; loop < LISTSIZE; loop++)
  524. XX            printf("   %2d. %s\n", loop+1, list[loop].name);
  525. XX         printf("\ns = help with styles  :-)\n");
  526. XX         printf("d = display in all styles\n");
  527. XX         printf("\nBy: %s and\n    %s\n", author[getpid() % 2],
  528. XX            author[!(getpid() % 2)]);
  529. XX         exit(0);
  530. XX      }
  531. XX   if((style = atoi(argv[1])) == 0)
  532. XX      switch(argv[1][0])
  533. XX         {
  534. XX            case 's': printf("Styles:\n");
  535. XX                      for(loop = 0; loop < LISTSIZE; loop++)
  536. XX                         {
  537. XX                            sprintf(temp_string, "   %2d. %s", loop+1, list[loop].name);
  538. XX                            (void) (*list[loop].function)(temp_string);
  539. XX                         }
  540. XX                      break;
  541. XX            case 'd': arglen = 0;
  542. XX                      for(loop = 2; loop < argc; loop++)
  543. XX                         arglen += strlen(argv[loop]) + 1;
  544. XX                      textptr = (char *) malloc(arglen);
  545. XX                      *textptr = '\0';
  546. XX                      for(loop = 2; loop < argc; loop++)
  547. XX                         {
  548. XX                            strcat(textptr, argv[loop]);
  549. XX                            if(loop != argc-1)
  550. XX                               strcat(textptr, " ");
  551. XX                         }
  552. XX                      for(loop = 0; loop < LISTSIZE; loop++)
  553. XX                         (void) (*list[loop].function)(textptr);
  554. XX                      break;
  555. XX            default: printf("Huh? (bad letter)\n");
  556. XX                     break;
  557. XX         }
  558. XX   else
  559. XX      if(style >= 1 && style <= LISTSIZE+1)
  560. XX         {
  561. XX            arglen = 0;
  562. XX            for(loop = 2; loop < argc; loop++)
  563. XX               arglen += strlen(argv[loop]) + 1;
  564. XX            textptr = (char *) malloc(arglen);
  565. XX            *textptr = '\0';
  566. XX            for(loop = 2; loop < argc; loop++)
  567. XX               {
  568. XX                  strcat(textptr, argv[loop]);
  569. XX                  if(loop != argc-1)
  570. XX                     strcat(textptr, " ");
  571. XX               }
  572. XX            (void) (*list[style-1].function)(textptr);
  573. XX         }
  574. XX      else
  575. XX         printf("Huh? (bad style number)\n");
  576. XX}
  577. SHAR_EOF
  578. if test 11316 -ne "`wc -c dotplan.c`"
  579. then
  580. echo shar: error transmitting dotplan.c '(should have been 11316 characters)'
  581. fi
  582. #    End of shell archive
  583. exit 0
  584. -- 
  585. Roger Murray
  586. "Look ma!  No ihnp4!"  :-)
  587. UUCP: ...!{randvax,sdcrdcf,ucbvax}!ucla-cs!cepu!ucla-an!remsit!rem
  588. ARPA: cepu!ucla-an!remsit!rem@CS.UCLA.EDU
  589.  
  590.  
  591.