home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume11 / menu_mh / part01 / dumb_menu.l < prev    next >
Encoding:
Text File  |  1990-03-10  |  2.5 KB  |  141 lines

  1.     /* @(#)dumb_menu.l    1.2 90/03/08 */
  2.     /* copyrite (c) Miller/Howard Investments, 1990 */
  3.  
  4. %{
  5. /* this thing is designed to use flex, not lex.  If you don't have
  6.    it, then you'll have to re-write the lexical analyser */
  7.  
  8. #include <ctype.h>
  9.  
  10.   char *saved_text;
  11. %}
  12.  
  13.     /* global definitions */
  14.  
  15. %x P_STATE T_STATE
  16.  
  17. %%
  18.  
  19. item    return ITEM;
  20. parm    return PARM;
  21. title    return TITLE;
  22. clear    return CLEAR;
  23. bold    return BOLD;
  24. "always-show"    return ALWAYS_SHOW;
  25. "{"    { BEGIN T_STATE ; }
  26. \"    { BEGIN P_STATE; }
  27. ";"    return ';';
  28. [ \t]+    ;
  29. \n    line_number++;
  30. .    return ERROR;
  31.  
  32. <T_STATE>"\\}"    add_text("}");
  33. <T_STATE>"}"    {
  34.     strip_white_space();
  35.       yylval.txt = saved_text;
  36.     saved_text = (char *)0;
  37.     BEGIN 0;
  38.     return TEXT; }
  39. <T_STATE>"\\\n"    {
  40.     line_number++;
  41.     add_text(yytext);
  42.     }
  43. <T_STATE>\\.    add_text(yytext);
  44. <T_STATE>[^\\}\n]+    add_text(yytext);
  45. <T_STATE>"\n"    {
  46.     line_number++;
  47.     add_text("\n");
  48.     }
  49.  
  50. <P_STATE>[A-Za-z0-9_]+    add_text(yytext);
  51. <P_STATE>\"    {
  52.     if (saved_text) {
  53.       strip_white_space();
  54.       yylval.txt = saved_text;
  55.       saved_text = (char *)0;
  56.       BEGIN 0;
  57.       return PARM_NAME;
  58.     }
  59.     fprintf(stderr, "lex error\n");
  60.     lex_errors++;
  61.     return ERROR;
  62.     }
  63. %%
  64.  
  65. /* c program text */
  66.  
  67. #define INIT_SIZE    256
  68. #define INC_SIZE    64
  69.  
  70. add_text(s)
  71. char *s;
  72. {
  73.   static int saved_length;
  74.   static int room_left;
  75.   int len = strlen(s);
  76.   static int saved_size;
  77.  
  78.   if (!saved_text) {
  79.     memset(saved_text = malloc(INIT_SIZE), '\0', INIT_SIZE);
  80.     room_left = INIT_SIZE;
  81.     saved_size = INIT_SIZE;
  82.     saved_length = 0;
  83.   }
  84.  
  85.   len++;            /* inc len to account for terminating null */
  86.   while (len >= room_left) {
  87.     saved_text = realloc(saved_text, saved_size += INC_SIZE);
  88.     room_left += INC_SIZE;
  89.   }
  90.  
  91.   memcpy(saved_text + saved_length, s, len);
  92.   /* the trailing null will be overwritten next time
  93.      so it doesn't count in computing room left */
  94.   room_left -= --len;
  95.   saved_length += len;
  96. }
  97.  
  98. strip_white_space()
  99. {
  100.   char *cp;
  101.   char *sp;
  102.  
  103.   if (!saved_text)
  104.     return;
  105.  
  106.   for (cp = saved_text + strlen(saved_text) - 1;cp > saved_text;cp--) {
  107.     if (!isspace(*cp))
  108.       break;
  109.   }
  110.   *++cp = '\0';
  111.  
  112.   for (cp=saved_text;*cp && isspace(*cp);cp++)
  113.     ;
  114.  
  115.   /* is it all white? */
  116.   if (!*cp && cp > saved_text) {
  117.     saved_text = realloc(saved_text, 1);
  118.     *saved_text = '\0';
  119.     return;
  120.   }
  121.  
  122.   /* is there any leading white space? */
  123.   if (cp > saved_text) {
  124.     char *tmp;
  125.     int len;
  126.  
  127.     tmp = malloc(len = strlen(cp) + 1);
  128.     memcpy(tmp, cp, len);
  129.     free(saved_text);
  130.     saved_text = tmp;
  131.  
  132.     return;
  133.   }
  134.  
  135.   saved_text = realloc(saved_text, strlen(saved_text) + 1);
  136. }
  137.  
  138. #ifdef yywrap
  139. #undef yywrap
  140. #endif
  141.