home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / CLISP-1.LHA / CLISP960530-sr.lha / utils / cvtmsgs.c < prev   
Encoding:
C/C++ Source or Header  |  1996-04-15  |  7.0 KB  |  305 lines

  1. #include <stdio.h>
  2.  
  3. #ifndef ENABLE_NLS
  4.   #ifdef DEUTSCH
  5.     #define LANGUAGE_STRING "DEUTSCH"
  6.     #undef DEUTSCH
  7.     #define DEUTSCH 1
  8.   #endif
  9.   #ifdef ENGLISH
  10.     #define LANGUAGE_STRING "ENGLISH"
  11.     #undef ENGLISH
  12.     #define ENGLISH 1
  13.   #endif
  14.   #ifdef FRANCAIS
  15.     #define LANGUAGE_STRING "FRANCAIS"
  16.     #undef FRANCAIS
  17.     #define FRANCAIS
  18.   #endif
  19.   #if (DEUTSCH+ENGLISH+FRANCAIS  == 1)
  20.     #define LANGUAGE_STATIC
  21.   #endif
  22. #endif
  23.  
  24. /* 
  25. # States (waiting means printing too)
  26. # 0:  copying until newline
  27. # 1:  copying spaces until / state=2 or newline state=0
  28. # 2:  check for second /, else print "/", ch, and state=0
  29. # 3:  check for #, else print "//", ch, and state=0
  30. # 4:  eating until non-space
  31. # 5:  read until space into language string
  32. # 6:  eating spaces until "
  33. # 7:  read until " (unless previous character was \)
  34. # 8:  print string if non-NLS and update #line, else print newline
  35. # 9:  #endif `e' or #line `l'
  36. # 10: #endif `n'
  37. # 11: #endif `d'
  38. # 12: #endif 'i'
  39. # 13: #endif 'f'
  40. # 14: print #endif, swallow rest of line and update #line
  41. # 15: #line `i'
  42. # 16: #line `n'
  43. # 17: #line `e'
  44. # 18: reset line number
  45. */
  46.  
  47. int line_no;
  48.  
  49. int getch()
  50. {
  51.   int ch;
  52.   ch=getchar();
  53.   if (ch=='\n') line_no++;
  54.   return ch;
  55. }
  56.  
  57. int main()
  58. {
  59.   int state = 1;
  60.   int ch,last_ch='\n';
  61.   int language_string_pos = -1;
  62.   int message_string_pos = -1;
  63.   int number_string_pos = -1;
  64.   int msg_line_no = -1;
  65.   char language_string[20];
  66.   char message_string[1024];
  67.  
  68.   line_no=1;
  69.   for (;(ch=getch())!=EOF;last_ch=ch)
  70.     {
  71.       switch(state)
  72.         {
  73.         case 0:
  74.           if (ch=='\n')
  75.             state=1;
  76.           putchar(ch);
  77.           break;
  78.         case 1:
  79.           switch (ch)
  80.             {
  81.             case '/':
  82.               msg_line_no=line_no;
  83.               state=2;
  84.               break;
  85. #if !defined(ENABLE_NLS) && !defined(LANGUAGE_STATIC)
  86.             case '#':
  87.               state=9;
  88.               break;
  89. #endif
  90.             default:
  91.               putchar(ch);
  92.               if (ch!=' ' && ch!='\n')
  93.                 state=0;
  94.             }
  95.           break;
  96.         case 2:
  97.           if (ch=='/')
  98.             state=3;
  99.           else
  100.             {
  101.               putchar('/');
  102.               putchar(ch);
  103.               state=0;
  104.             }
  105.           break;
  106.         case 3:
  107.           if (ch==':')
  108.             state=4;
  109.           else
  110.             {
  111.               putchar('/');
  112.               putchar('/');
  113.               putchar(ch);
  114.               state=0;
  115.             }
  116.           break;
  117.         case 4:
  118.           if (ch != ' ')
  119.             {
  120.               state=5;
  121.               language_string[0]=ch;
  122.               language_string_pos=1;
  123.             }
  124.           break;
  125.         case 5:
  126.           if (ch != ' ')
  127.             language_string[language_string_pos++]=ch;
  128.           else
  129.             state=6;
  130.           break;
  131.         case 6:
  132.           if (ch == '"')
  133.             {
  134.               state=7;
  135.               language_string[language_string_pos]='\0';
  136.               message_string_pos=0;
  137.             }
  138.           break;
  139.         case 7:
  140.           if (ch == '"' && last_ch != '\\')
  141.             state=8;
  142.           else
  143.             message_string[message_string_pos++]=ch;
  144.           break;
  145.         case 8:
  146.           #ifdef ENABLE_NLS
  147.           putchar('\n');
  148.           #else
  149.             #ifdef LANGUAGE_STATIC
  150.             if (strcmp(language_string,LANGUAGE_STRING)==0)
  151.             #endif
  152.               {
  153.                 message_string[message_string_pos]='\0';
  154.                 printf("#undef %s_MSG\n",language_string);
  155.                 printf("#define %s_MSG \"%s\"\n",
  156.                        language_string,message_string);
  157.                 #ifndef LANGUAGE_STATIC
  158.                 printf("#line %d\n",msg_line_no);
  159.                 #else 
  160.                 putchar('\n');
  161.                 #endif
  162.               }
  163.             #ifdef LANGUAGE_STATIC
  164.             else fputs("\n\n\n",stdout);
  165.             #endif
  166.           #endif
  167.           do
  168.             {
  169.               if (ch=='\n') break;
  170.             } while((ch=getch())!=EOF);
  171.           state=1;
  172.           break;
  173.         #if !defined(ENABLE_NLS) && !defined(LANGUAGE_STATIC)
  174.         case 9:
  175.           switch (ch)
  176.             {
  177.             case 'e':
  178.               state=10;
  179.               break;
  180.             case 'l':
  181.               state=15;
  182.               break;
  183.             default:
  184.               putchar('#');
  185.               putchar(ch);
  186.               state=0;
  187.             }
  188.           break;
  189.         case 10:
  190.           if (ch=='n')
  191.             state=11;
  192.           else
  193.             {
  194.               putchar('#'); putchar('e');
  195.               putchar(ch);
  196.               state=0;
  197.             }
  198.           break;
  199.         case 11:
  200.           if (ch=='d')
  201.             state=12;
  202.           else
  203.             { 
  204.               fputs("#en",stdout);
  205.               putchar(ch);
  206.               state=0;
  207.             }
  208.           break;
  209.         case 12:
  210.           if (ch=='i')
  211.             state=13;
  212.           else
  213.             {
  214.               fputs("#end",stdout);
  215.               putchar(ch);
  216.               state=0;
  217.             }
  218.           break;
  219.         case 13:
  220.           if (ch=='f')
  221.             state=14;
  222.           else
  223.             {
  224.               fputs("#endi",stdout);
  225.               putchar(ch);
  226.               state=0;
  227.             }
  228.           break;
  229.         case 14:
  230.           fputs("#endif",stdout);
  231.           if (ch == '\n' || ch==' ')
  232.             {
  233.               do
  234.                 {
  235.                   putchar(ch);
  236.                   if (ch=='\n') break;
  237.                 } while((ch=getch())!=EOF);
  238.               printf("#line %d\n",line_no-1);
  239.               state=1;
  240.             }
  241.           else state=0;
  242.           break;
  243.         case 15:
  244.           if (ch=='i')
  245.             state=16;
  246.           else
  247.             {
  248.               fputs("#l",stdout);
  249.               putchar(ch);
  250.               state=0;
  251.             }
  252.           break;
  253.         case 16:
  254.           if (ch == 'n')
  255.             state=17;
  256.           else
  257.             {
  258.               fputs("#li",stdout);
  259.               putchar(ch);
  260.               state=0;
  261.             }
  262.           break;
  263.         case 17:
  264.           if (ch == 'e')
  265.             state=18;
  266.           else
  267.             {
  268.               fputs("#lin",stdout);
  269.               putchar(ch);
  270.               state=0;
  271.             }
  272.           break;
  273.         case 18:
  274.           while (ch == ' ' && ch != EOF) { ch=getch(); }
  275.           { 
  276.             int val=0;
  277.             while (ch >= '0' && ch <= '9' && ch != EOF)
  278.               { 
  279.                 val*=10;
  280.                 val+=(ch - '0');
  281.                 ch=getch();
  282.               }
  283.             while (ch == ' ' && ch != '\n' && ch != EOF) ch=getch();
  284.             if (ch == '"')
  285.               { char filename[80];
  286.                 int filename_pos=0;
  287.                 while ((ch=getch())!=EOF)
  288.                   {
  289.                     if (ch == '"') break;
  290.                     filename[filename_pos++]=ch;
  291.                   }
  292.                 filename[filename_pos]='\0';
  293.                 printf("#line %d \"%s\"\n",val,filename);
  294.               }
  295.             while (ch != '\n' && ch != EOF) ch=getch();
  296.             line_no = val;
  297.             state=1;
  298.           }
  299.           break;
  300.         #endif
  301.         }
  302.     }
  303.   exit(0);
  304. }
  305.