1diff -ru src.orig/xget-lex.c src/xget-lex.c
2--- src.orig/xget-lex.c	Fri May  1 06:45:12 1998
3+++ src/xget-lex.c	Fri Apr 27 16:05:06 2001
4@@ -78,17 +78,18 @@
5
6 enum token_type_ty
7 {
8-  token_type_character_constant,
9-  token_type_eof,
10-  token_type_eoln,
11-  token_type_hash,
12-  token_type_lp,
13-  token_type_comma,
14-  token_type_name,
15-  token_type_number,
16-  token_type_string_literal,
17-  token_type_symbol,
18-  token_type_white_space
19+  token_type_character_constant = 0,
20+  token_type_eof = 1,
21+  token_type_eoln = 2,
22+  token_type_hash = 3,
23+  token_type_lp = 4,
24+  token_type_rp = 5,
25+  token_type_comma = 6,
26+  token_type_name = 7,
27+  token_type_number = 8,
28+  token_type_string_literal = 9,
29+  token_type_symbol = 10,
30+  token_type_white_space = 11
31 };
32 typedef enum token_type_ty token_type_ty;
33
34@@ -941,6 +942,10 @@
35       tp->type = token_type_lp;
36       return;
37
38+    case ')':
39+      tp->type = token_type_rp;
40+      return;
41+
42     case ',':
43       tp->type = token_type_comma;
44       return;
45@@ -1236,6 +1241,11 @@
46 	  tp->type = xgettext_token_type_lp;
47 	  return;
48
49+	case token_type_rp:
50+	  last_non_comment_line = newline_count;
51+	  tp->type = xgettext_token_type_rp;
52+	  return;
53+
54 	case token_type_comma:
55 	  last_non_comment_line = newline_count;
56
57diff -ru src.orig/xget-lex.h src/xget-lex.h
58--- src.orig/xget-lex.h	Fri May  1 06:45:23 1998
59+++ src/xget-lex.h	Fri Apr 27 16:05:06 2001
60@@ -22,13 +22,14 @@
61
62 enum xgettext_token_type_ty
63 {
64-  xgettext_token_type_eof,
65-  xgettext_token_type_keyword1,
66-  xgettext_token_type_keyword2,
67-  xgettext_token_type_lp,
68-  xgettext_token_type_comma,
69-  xgettext_token_type_string_literal,
70-  xgettext_token_type_symbol
71+  xgettext_token_type_eof = 0,
72+  xgettext_token_type_keyword1 = 1,
73+  xgettext_token_type_keyword2 = 2,
74+  xgettext_token_type_lp = 3,
75+  xgettext_token_type_rp = 4,
76+  xgettext_token_type_comma = 5,
77+  xgettext_token_type_string_literal = 6,
78+  xgettext_token_type_symbol = 7
79 };
80 typedef enum xgettext_token_type_ty xgettext_token_type_ty;
81
82diff -ru src.orig/xgettext.c src/xgettext.c
83--- src.orig/xgettext.c	Wed Apr 29 18:57:50 1998
84+++ src/xgettext.c	Fri Apr 27 16:33:46 2001
85@@ -835,7 +835,8 @@
86      int is_cpp_file;
87 {
88   int state;
89-
90+  char *msgid = 0;
91+
92   /* Inform scanner whether we have C++ files or not.  */
93   if (is_cpp_file)
94     xgettext_lex_cplusplus ();
95@@ -861,8 +862,12 @@
96 	State 3 = seen one of our keywords with string in second parameter
97 	State 4 = was in state 3 and now saw a left paren
98 	State 5 = waiting for comma after being in state 4
99-	State 6 = saw comma after being in state 5  */
100+	State 6 = saw comma after being in state 5
101+	State 7 = after comma and being in state 2
102+        State 8 = after string and being in state 7
103+     */
104      xgettext_lex (&token);
105+
106      switch (token.type)
107        {
108        case xgettext_token_type_keyword1:
109@@ -886,18 +891,62 @@
110 	     state = 0;
111 	   }
112 	 continue;
113+
114+       case xgettext_token_type_rp:
115+	 if (state == 2 || state == 8) {
116+	   token.string = strdup(msgid);
117+	   remember_a_message (mlp, &token);
118+	   free(msgid);
119+	   msgid = 0;
120+	   state = 0;
121+	 }
122+	 continue;
123
124        case xgettext_token_type_comma:
125-	 state = state == 5 ? 6 : 0;
126+	 switch (state) {
127+	 case 5:
128+	   state = 6;
129+	   break;
130+	 case 2:
131+           state = 7;
132+	   break;
133+         case 8: {
134+	     char *newstring = (char*)malloc(strlen(msgid) + 2);
135+	     strcpy(newstring, "_n:");
136+	     strcat(newstring, msgid + 2);
137+	     free(msgid);
138+	     token.string = newstring;
139+	     remember_a_message (mlp, &token);
140+	     msgid = 0;
141+	     state = 0;
142+	     break;
143+	 }
144+	 default:
145+	   state = 0;
146+	   break;
147+	 }
148 	 continue;
149
150        case xgettext_token_type_string_literal:
151 	 if (extract_all || state == 2 || state == 6)
152 	   {
153-	     remember_a_message (mlp, &token);
154-	     state = 0;
155+	     if (msgid)
156+	       free(msgid);
157+	     msgid = strdup(token.string);
158+	     //	     state = 0;
159 	   }
160-	 else
161+	 else if (state == 7)
162+	   {
163+	     if (msgid) {
164+	       char *newstring = (char*)malloc(strlen(msgid) + strlen(token.string) + 20);
165+	       sprintf(newstring, "_: %s\n%s", msgid, token.string);
166+	       free(msgid);
167+	       free(token.string);
168+	       token.string = msgid = newstring;
169+	       state = 8;
170+	     }
171+	   }
172+	 else
173 	   {
174 	     free (token.string);
175 	     state = (state == 4 || state == 5) ? 5 : 0;
176@@ -905,8 +954,8 @@
177 	 continue;
178
179        case xgettext_token_type_symbol:
180-	 state = (state == 4 || state == 5) ? 5 : 0;
181-	 continue;
182+	   state = (state == 4 || state == 5) ? 5 : 0;
183+	   continue;
184
185        default:
186 	 state = 0;
187@@ -915,6 +964,7 @@
188        case xgettext_token_type_eof:
189 	 break;
190        }
191+
192      break;
193    }
194
195