home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gettext-0.10.24-src.tgz / tar.out / fsf / gettext / src / po-hash.y < prev    next >
Text File  |  1996-09-28  |  4KB  |  231 lines

  1. /* GNU gettext - internationalization aids
  2.    Copyright (C) 1995, 1996 Free Software Foundation, Inc.
  3.  
  4.    This file was written by Peter Miller <pmiller@agso.gov.au>
  5.  
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  19.  
  20. %{
  21.  
  22. #ifdef HAVE_CONFIG_H
  23. # include "config.h"
  24. #endif
  25.  
  26. #include <stdio.h>
  27.  
  28. #include <system.h>
  29. #include "po-hash.h"
  30. #include "po.h"
  31.  
  32. %}
  33.  
  34. %token STRING
  35. %token NUMBER
  36. %token COLON
  37. %token COMMA
  38. %token FILE_KEYWORD
  39. %token LINE_KEYWORD
  40. %token NUMBER_KEYWORD
  41.  
  42. %union
  43. {
  44.   char *string;
  45.   int number;
  46. }
  47.  
  48. %type <number> NUMBER
  49. %type <string> STRING
  50.  
  51. %{
  52.  
  53. static const char *cur;
  54.  
  55.  
  56. void yyerror PARAMS ((char *));
  57. int yylex PARAMS ((void));
  58.  
  59.  
  60. int
  61. po_hash (s)
  62.      const char *s;
  63. {
  64.   extern int yyparse PARAMS ((void));
  65.  
  66.   cur = s;
  67.   return yyparse ();
  68. }
  69.  
  70.  
  71. void
  72. yyerror (s)
  73.      char *s;
  74. {
  75.   /* Do nothing, the grammar is used as a recogniser.  */
  76. }
  77. %}
  78.  
  79. %%
  80.  
  81. filepos_line
  82.     : /* empty */
  83.     | filepos_line filepos
  84.     ;
  85.  
  86. filepos
  87.     : STRING COLON NUMBER
  88.         {
  89.           /* GNU style */
  90.           po_callback_comment_filepos ($1, $3);
  91.           free ($1);
  92.         }
  93.     | FILE_KEYWORD COLON STRING COMMA LINE_KEYWORD COLON NUMBER
  94.         {
  95.           /* SunOS style */
  96.           po_callback_comment_filepos ($3, $7);
  97.           free ($3);
  98.         }
  99.     | FILE_KEYWORD COLON STRING COMMA LINE_KEYWORD NUMBER_KEYWORD COLON NUMBER
  100.         {
  101.           /* Solaris style */
  102.           po_callback_comment_filepos ($3, $8);
  103.           free ($3);
  104.         }
  105.     | FILE_KEYWORD COLON NUMBER
  106.         {
  107.           /* GNU style, but STRING is `file'.  Esiteric, but it
  108.              happened.  */
  109.           po_callback_comment_filepos ("file", $3);
  110.         }
  111.     ;
  112.  
  113. %%
  114.  
  115.  
  116. int
  117. yylex ()
  118. {
  119.   static char *buf;
  120.   static size_t bufmax;
  121.   size_t bufpos;
  122.   int n;
  123.   int c;
  124.  
  125.   for (;;)
  126.     {
  127.       c = *cur++;
  128.       switch (c)
  129.     {
  130.     case 0:
  131.       --cur;
  132.       return 0;
  133.  
  134.     case ' ':
  135.     case '\t':
  136.     case '\n':
  137.       break;
  138.  
  139.     case ':':
  140.       return COLON;
  141.  
  142.     case ',':
  143.       return COMMA;
  144.  
  145.     case '0':
  146.     case '1':
  147.     case '2':
  148.     case '3':
  149.     case '4':
  150.     case '5':
  151.     case '6':
  152.     case '7':
  153.     case '8':
  154.     case '9':
  155.       /* Accumulate a number.  */
  156.       n = 0;
  157.       for (;;)
  158.         {
  159.           n = n * 10 + c - '0';
  160.           c = *cur++;
  161.           switch (c)
  162.         {
  163.         default:
  164.           break;
  165.  
  166.         case '0':
  167.         case '1':
  168.         case '2':
  169.         case '3':
  170.         case '4':
  171.         case '5':
  172.         case '6':
  173.         case '7':
  174.         case '8':
  175.         case '9':
  176.           continue;
  177.         }
  178.           break;
  179.         }
  180.       --cur;
  181.       yylval.number = n;
  182.       return NUMBER;
  183.  
  184.     default:
  185.       /* Accumulate a string.  */
  186.       bufpos = 0;
  187.       for (;;)
  188.         {
  189.           if (bufpos >= bufmax)
  190.         {
  191.           bufmax += 100;
  192.           buf = xrealloc (buf, bufmax);
  193.         }
  194.           buf[bufpos++] = c;
  195.  
  196.           c = *cur++;
  197.           switch (c)
  198.             {
  199.             default:
  200.               continue;
  201.  
  202.             case 0:
  203.             case ':':
  204.             case ',':
  205.             case ' ':
  206.             case '\t':
  207.               --cur;
  208.               break;
  209.             }
  210.           break;
  211.         }
  212.  
  213.       if (bufpos >= bufmax)
  214.         {
  215.           bufmax += 100;
  216.           buf = xrealloc (buf, bufmax);
  217.         }
  218.       buf[bufpos] = 0;
  219.  
  220.       if (strcmp (buf, "file") == 0 || strcmp (buf, "File") == 0)
  221.         return FILE_KEYWORD;
  222.       if (strcmp (buf, "line") == 0)
  223.         return LINE_KEYWORD;
  224.       if (strcmp (buf, "number") == 0)
  225.         return NUMBER_KEYWORD;
  226.       yylval.string = xstrdup (buf);
  227.       return STRING;
  228.     }
  229.     }
  230. }
  231.