1 /* Generated by Snowball 2.0.0 - https://snowballstem.org/ */
2
3
4 #include <config.h>
5 #include <limits.h>
6 #include "porter.h"
7
8 #define s_0_0 (s_0_1 + 2)
9 static const symbol s_pool[] = {
10 #define s_0_1 0
11 'i', 'e', 's',
12 #define s_0_2 3
13 's', 's', 'e', 's',
14 #define s_0_3 s_0_2
15 #define s_1_1 7
16 'b', 'b',
17 #define s_1_2 9
18 'd', 'd',
19 #define s_1_3 11
20 'f', 'f',
21 #define s_1_4 13
22 'g', 'g',
23 #define s_1_5 15
24 'b', 'l',
25 #define s_1_6 17
26 'm', 'm',
27 #define s_1_7 19
28 'n', 'n',
29 #define s_1_8 21
30 'p', 'p',
31 #define s_1_9 23
32 'r', 'r',
33 #define s_1_10 25
34 'a', 't',
35 #define s_1_11 27
36 't', 't',
37 #define s_1_12 29
38 'i', 'z',
39 #define s_2_0 (s_2_1 + 1)
40 #define s_2_1 31
41 'e', 'e', 'd',
42 #define s_2_2 34
43 'i', 'n', 'g',
44 #define s_3_0 37
45 'a', 'n', 'c', 'i',
46 #define s_3_1 41
47 'e', 'n', 'c', 'i',
48 #define s_3_2 45
49 'a', 'b', 'l', 'i',
50 #define s_3_3 49
51 'e', 'l', 'i',
52 #define s_3_4 52
53 'a', 'l', 'l', 'i',
54 #define s_3_5 56
55 'o', 'u', 's', 'l', 'i',
56 #define s_3_6 61
57 'e', 'n', 't', 'l', 'i',
58 #define s_3_7 66
59 'a', 'l', 'i', 't', 'i',
60 #define s_3_8 71
61 'b', 'i', 'l', 'i', 't', 'i',
62 #define s_3_9 77
63 'i', 'v', 'i', 't', 'i',
64 #define s_3_10 (s_3_11 + 1)
65 #define s_3_11 82
66 'a', 't', 'i', 'o', 'n', 'a', 'l',
67 #define s_3_12 89
68 'a', 'l', 'i', 's', 'm',
69 #define s_3_13 s_3_11
70 #define s_3_14 94
71 'i', 'z', 'a', 't', 'i', 'o', 'n',
72 #define s_3_15 101
73 'i', 'z', 'e', 'r',
74 #define s_3_16 105
75 'a', 't', 'o', 'r',
76 #define s_3_17 109
77 'i', 'v', 'e', 'n', 'e', 's', 's',
78 #define s_3_18 116
79 'f', 'u', 'l', 'n', 'e', 's', 's',
80 #define s_3_19 123
81 'o', 'u', 's', 'n', 'e', 's', 's',
82 #define s_4_0 130
83 'i', 'c', 'a', 't', 'e',
84 #define s_4_1 135
85 'a', 't', 'i', 'v', 'e',
86 #define s_4_2 140
87 'a', 'l', 'i', 'z', 'e',
88 #define s_4_3 145
89 'i', 'c', 'i', 't', 'i',
90 #define s_4_4 150
91 'i', 'c', 'a', 'l',
92 #define s_4_5 154
93 'f', 'u', 'l',
94 #define s_4_6 157
95 'n', 'e', 's', 's',
96 #define s_5_0 161
97 'i', 'c',
98 #define s_5_1 163
99 'a', 'n', 'c', 'e',
100 #define s_5_2 167
101 'e', 'n', 'c', 'e',
102 #define s_5_3 171
103 'a', 'b', 'l', 'e',
104 #define s_5_4 175
105 'i', 'b', 'l', 'e',
106 #define s_5_5 179
107 'a', 't', 'e',
108 #define s_5_6 182
109 'i', 'v', 'e',
110 #define s_5_7 185
111 'i', 'z', 'e',
112 #define s_5_8 188
113 'i', 't', 'i',
114 #define s_5_9 191
115 'a', 'l',
116 #define s_5_10 193
117 'i', 's', 'm',
118 #define s_5_11 196
119 'i', 'o', 'n',
120 #define s_5_12 199
121 'e', 'r',
122 #define s_5_13 201
123 'o', 'u', 's',
124 #define s_5_14 204
125 'a', 'n', 't',
126 #define s_5_15 (s_5_16 + 1)
127 #define s_5_16 (s_5_17 + 1)
128 #define s_5_17 207
129 'e', 'm', 'e', 'n', 't',
130 #define s_5_18 s_5_13
131 };
132
133
134 static const struct among a_0[4] =
135 {
136 /* 0 */ { 1, s_0_0, -1, 3},
137 /* 1 */ { 3, s_0_1, 0, 2},
138 /* 2 */ { 4, s_0_2, 0, 1},
139 /* 3 */ { 2, s_0_3, 0, -1}
140 };
141
142
143 static const struct among a_1[13] =
144 {
145 /* 0 */ { 0, 0, -1, 3},
146 /* 1 */ { 2, s_1_1, 0, 2},
147 /* 2 */ { 2, s_1_2, 0, 2},
148 /* 3 */ { 2, s_1_3, 0, 2},
149 /* 4 */ { 2, s_1_4, 0, 2},
150 /* 5 */ { 2, s_1_5, 0, 1},
151 /* 6 */ { 2, s_1_6, 0, 2},
152 /* 7 */ { 2, s_1_7, 0, 2},
153 /* 8 */ { 2, s_1_8, 0, 2},
154 /* 9 */ { 2, s_1_9, 0, 2},
155 /* 10 */ { 2, s_1_10, 0, 1},
156 /* 11 */ { 2, s_1_11, 0, 2},
157 /* 12 */ { 2, s_1_12, 0, 1}
158 };
159
160
161 static const struct among a_2[3] =
162 {
163 /* 0 */ { 2, s_2_0, -1, 2},
164 /* 1 */ { 3, s_2_1, 0, 1},
165 /* 2 */ { 3, s_2_2, -1, 2}
166 };
167
168
169 static const struct among a_3[20] =
170 {
171 /* 0 */ { 4, s_3_0, -1, 3},
172 /* 1 */ { 4, s_3_1, -1, 2},
173 /* 2 */ { 4, s_3_2, -1, 4},
174 /* 3 */ { 3, s_3_3, -1, 6},
175 /* 4 */ { 4, s_3_4, -1, 9},
176 /* 5 */ { 5, s_3_5, -1, 11},
177 /* 6 */ { 5, s_3_6, -1, 5},
178 /* 7 */ { 5, s_3_7, -1, 9},
179 /* 8 */ { 6, s_3_8, -1, 13},
180 /* 9 */ { 5, s_3_9, -1, 12},
181 /* 10 */ { 6, s_3_10, -1, 1},
182 /* 11 */ { 7, s_3_11, 10, 8},
183 /* 12 */ { 5, s_3_12, -1, 9},
184 /* 13 */ { 5, s_3_13, -1, 8},
185 /* 14 */ { 7, s_3_14, 13, 7},
186 /* 15 */ { 4, s_3_15, -1, 7},
187 /* 16 */ { 4, s_3_16, -1, 8},
188 /* 17 */ { 7, s_3_17, -1, 12},
189 /* 18 */ { 7, s_3_18, -1, 10},
190 /* 19 */ { 7, s_3_19, -1, 11}
191 };
192
193
194 static const struct among a_4[7] =
195 {
196 /* 0 */ { 5, s_4_0, -1, 2},
197 /* 1 */ { 5, s_4_1, -1, 3},
198 /* 2 */ { 5, s_4_2, -1, 1},
199 /* 3 */ { 5, s_4_3, -1, 2},
200 /* 4 */ { 4, s_4_4, -1, 2},
201 /* 5 */ { 3, s_4_5, -1, 3},
202 /* 6 */ { 4, s_4_6, -1, 3}
203 };
204
205
206 static const struct among a_5[19] =
207 {
208 /* 0 */ { 2, s_5_0, -1, 1},
209 /* 1 */ { 4, s_5_1, -1, 1},
210 /* 2 */ { 4, s_5_2, -1, 1},
211 /* 3 */ { 4, s_5_3, -1, 1},
212 /* 4 */ { 4, s_5_4, -1, 1},
213 /* 5 */ { 3, s_5_5, -1, 1},
214 /* 6 */ { 3, s_5_6, -1, 1},
215 /* 7 */ { 3, s_5_7, -1, 1},
216 /* 8 */ { 3, s_5_8, -1, 1},
217 /* 9 */ { 2, s_5_9, -1, 1},
218 /* 10 */ { 3, s_5_10, -1, 1},
219 /* 11 */ { 3, s_5_11, -1, 2},
220 /* 12 */ { 2, s_5_12, -1, 1},
221 /* 13 */ { 3, s_5_13, -1, 1},
222 /* 14 */ { 3, s_5_14, -1, 1},
223 /* 15 */ { 3, s_5_15, -1, 1},
224 /* 16 */ { 4, s_5_16, 15, 1},
225 /* 17 */ { 5, s_5_17, 16, 1},
226 /* 18 */ { 2, s_5_18, -1, 1}
227 };
228
229 static const unsigned char g_v[] = { 17, 65, 16, 1 };
230
231 static const unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 };
232
233 static const symbol s_0[] = { 's', 's' };
234 static const symbol s_1[] = { 'i' };
235 static const symbol s_2[] = { 'e', 'e' };
236 static const symbol s_3[] = { 'e' };
237 static const symbol s_4[] = { 'e' };
238 static const symbol s_5[] = { 'i' };
239 static const symbol s_6[] = { 't', 'i', 'o', 'n' };
240 static const symbol s_7[] = { 'e', 'n', 'c', 'e' };
241 static const symbol s_8[] = { 'a', 'n', 'c', 'e' };
242 static const symbol s_9[] = { 'a', 'b', 'l', 'e' };
243 static const symbol s_10[] = { 'e', 'n', 't' };
244 static const symbol s_11[] = { 'e' };
245 static const symbol s_12[] = { 'i', 'z', 'e' };
246 static const symbol s_13[] = { 'a', 't', 'e' };
247 static const symbol s_14[] = { 'a', 'l' };
248 static const symbol s_15[] = { 'f', 'u', 'l' };
249 static const symbol s_16[] = { 'o', 'u', 's' };
250 static const symbol s_17[] = { 'i', 'v', 'e' };
251 static const symbol s_18[] = { 'b', 'l', 'e' };
252 static const symbol s_19[] = { 'a', 'l' };
253 static const symbol s_20[] = { 'i', 'c' };
254 static const symbol s_21[] = { 'Y' };
255 static const symbol s_22[] = { 'Y' };
256 static const symbol s_23[] = { 'y' };
257
r_shortv()258 int Xapian::InternalStemPorter::r_shortv() {
259 if (out_grouping_b_U(g_v_WXY, 89, 121, 0)) return 0;
260 if (in_grouping_b_U(g_v, 97, 121, 0)) return 0;
261 if (out_grouping_b_U(g_v, 97, 121, 0)) return 0;
262 return 1;
263 }
264
r_R1()265 int Xapian::InternalStemPorter::r_R1() {
266 if (!(I_p1 <= c)) return 0;
267 return 1;
268 }
269
r_R2()270 int Xapian::InternalStemPorter::r_R2() {
271 if (!(I_p2 <= c)) return 0;
272 return 1;
273 }
274
r_Step_1a()275 int Xapian::InternalStemPorter::r_Step_1a() {
276 int among_var;
277 ket = c;
278 if (c <= lb || p[c - 1] != 115) return 0;
279 among_var = find_among_b(s_pool, a_0, 4, 0, 0);
280 if (!(among_var)) return 0;
281 bra = c;
282 switch (among_var) {
283 case 1:
284 { int ret = slice_from_s(2, s_0);
285 if (ret < 0) return ret;
286 }
287 break;
288 case 2:
289 { int ret = slice_from_s(1, s_1);
290 if (ret < 0) return ret;
291 }
292 break;
293 case 3:
294 { int ret = slice_del();
295 if (ret < 0) return ret;
296 }
297 break;
298 }
299 return 1;
300 }
301
r_Step_1b()302 int Xapian::InternalStemPorter::r_Step_1b() {
303 int among_var;
304 ket = c;
305 if (c - 1 <= lb || (p[c - 1] != 100 && p[c - 1] != 103)) return 0;
306 among_var = find_among_b(s_pool, a_2, 3, 0, 0);
307 if (!(among_var)) return 0;
308 bra = c;
309 switch (among_var) {
310 case 1:
311 { int ret = r_R1();
312 if (ret <= 0) return ret;
313 }
314 { int ret = slice_from_s(2, s_2);
315 if (ret < 0) return ret;
316 }
317 break;
318 case 2:
319 { int m_test1 = l - c;
320 {
321 int ret = out_grouping_b_U(g_v, 97, 121, 1);
322 if (ret < 0) return 0;
323 c -= ret;
324 }
325 c = l - m_test1;
326 }
327 { int ret = slice_del();
328 if (ret < 0) return ret;
329 }
330 { int m_test2 = l - c;
331 if (c - 1 <= lb || p[c - 1] >> 5 != 3 || !((68514004 >> (p[c - 1] & 0x1f)) & 1)) among_var = 3; else
332 among_var = find_among_b(s_pool, a_1, 13, 0, 0);
333 if (!(among_var)) return 0;
334 c = l - m_test2;
335 }
336 switch (among_var) {
337 case 1:
338 { int saved_c = c;
339 insert_s(c, c, 1, s_3);
340 c = saved_c;
341 }
342 break;
343 case 2:
344 ket = c;
345 { int ret = skip_utf8(p, c, lb, 0, -1);
346 if (ret < 0) return 0;
347 c = ret;
348 }
349 bra = c;
350 { int ret = slice_del();
351 if (ret < 0) return ret;
352 }
353 break;
354 case 3:
355 if (c != I_p1) return 0;
356 { int m_test3 = l - c;
357 { int ret = r_shortv();
358 if (ret <= 0) return ret;
359 }
360 c = l - m_test3;
361 }
362 { int saved_c = c;
363 insert_s(c, c, 1, s_4);
364 c = saved_c;
365 }
366 break;
367 }
368 break;
369 }
370 return 1;
371 }
372
r_Step_1c()373 int Xapian::InternalStemPorter::r_Step_1c() {
374 ket = c;
375 { int m1 = l - c; (void)m1;
376 if (c <= lb || p[c - 1] != 'y') goto lab1;
377 c--;
378 goto lab0;
379 lab1:
380 c = l - m1;
381 if (c <= lb || p[c - 1] != 'Y') return 0;
382 c--;
383 }
384 lab0:
385 bra = c;
386 {
387 int ret = out_grouping_b_U(g_v, 97, 121, 1);
388 if (ret < 0) return 0;
389 c -= ret;
390 }
391 { int ret = slice_from_s(1, s_5);
392 if (ret < 0) return ret;
393 }
394 return 1;
395 }
396
r_Step_2()397 int Xapian::InternalStemPorter::r_Step_2() {
398 int among_var;
399 ket = c;
400 if (c - 2 <= lb || p[c - 1] >> 5 != 3 || !((815616 >> (p[c - 1] & 0x1f)) & 1)) return 0;
401 among_var = find_among_b(s_pool, a_3, 20, 0, 0);
402 if (!(among_var)) return 0;
403 bra = c;
404 { int ret = r_R1();
405 if (ret <= 0) return ret;
406 }
407 switch (among_var) {
408 case 1:
409 { int ret = slice_from_s(4, s_6);
410 if (ret < 0) return ret;
411 }
412 break;
413 case 2:
414 { int ret = slice_from_s(4, s_7);
415 if (ret < 0) return ret;
416 }
417 break;
418 case 3:
419 { int ret = slice_from_s(4, s_8);
420 if (ret < 0) return ret;
421 }
422 break;
423 case 4:
424 { int ret = slice_from_s(4, s_9);
425 if (ret < 0) return ret;
426 }
427 break;
428 case 5:
429 { int ret = slice_from_s(3, s_10);
430 if (ret < 0) return ret;
431 }
432 break;
433 case 6:
434 { int ret = slice_from_s(1, s_11);
435 if (ret < 0) return ret;
436 }
437 break;
438 case 7:
439 { int ret = slice_from_s(3, s_12);
440 if (ret < 0) return ret;
441 }
442 break;
443 case 8:
444 { int ret = slice_from_s(3, s_13);
445 if (ret < 0) return ret;
446 }
447 break;
448 case 9:
449 { int ret = slice_from_s(2, s_14);
450 if (ret < 0) return ret;
451 }
452 break;
453 case 10:
454 { int ret = slice_from_s(3, s_15);
455 if (ret < 0) return ret;
456 }
457 break;
458 case 11:
459 { int ret = slice_from_s(3, s_16);
460 if (ret < 0) return ret;
461 }
462 break;
463 case 12:
464 { int ret = slice_from_s(3, s_17);
465 if (ret < 0) return ret;
466 }
467 break;
468 case 13:
469 { int ret = slice_from_s(3, s_18);
470 if (ret < 0) return ret;
471 }
472 break;
473 }
474 return 1;
475 }
476
r_Step_3()477 int Xapian::InternalStemPorter::r_Step_3() {
478 int among_var;
479 ket = c;
480 if (c - 2 <= lb || p[c - 1] >> 5 != 3 || !((528928 >> (p[c - 1] & 0x1f)) & 1)) return 0;
481 among_var = find_among_b(s_pool, a_4, 7, 0, 0);
482 if (!(among_var)) return 0;
483 bra = c;
484 { int ret = r_R1();
485 if (ret <= 0) return ret;
486 }
487 switch (among_var) {
488 case 1:
489 { int ret = slice_from_s(2, s_19);
490 if (ret < 0) return ret;
491 }
492 break;
493 case 2:
494 { int ret = slice_from_s(2, s_20);
495 if (ret < 0) return ret;
496 }
497 break;
498 case 3:
499 { int ret = slice_del();
500 if (ret < 0) return ret;
501 }
502 break;
503 }
504 return 1;
505 }
506
r_Step_4()507 int Xapian::InternalStemPorter::r_Step_4() {
508 int among_var;
509 ket = c;
510 if (c - 1 <= lb || p[c - 1] >> 5 != 3 || !((3961384 >> (p[c - 1] & 0x1f)) & 1)) return 0;
511 among_var = find_among_b(s_pool, a_5, 19, 0, 0);
512 if (!(among_var)) return 0;
513 bra = c;
514 { int ret = r_R2();
515 if (ret <= 0) return ret;
516 }
517 switch (among_var) {
518 case 1:
519 { int ret = slice_del();
520 if (ret < 0) return ret;
521 }
522 break;
523 case 2:
524 { int m1 = l - c; (void)m1;
525 if (c <= lb || p[c - 1] != 's') goto lab1;
526 c--;
527 goto lab0;
528 lab1:
529 c = l - m1;
530 if (c <= lb || p[c - 1] != 't') return 0;
531 c--;
532 }
533 lab0:
534 { int ret = slice_del();
535 if (ret < 0) return ret;
536 }
537 break;
538 }
539 return 1;
540 }
541
r_Step_5a()542 int Xapian::InternalStemPorter::r_Step_5a() {
543 ket = c;
544 if (c <= lb || p[c - 1] != 'e') return 0;
545 c--;
546 bra = c;
547 { int m1 = l - c; (void)m1;
548 { int ret = r_R2();
549 if (ret == 0) goto lab1;
550 if (ret < 0) return ret;
551 }
552 goto lab0;
553 lab1:
554 c = l - m1;
555 { int ret = r_R1();
556 if (ret <= 0) return ret;
557 }
558 { int m2 = l - c; (void)m2;
559 { int ret = r_shortv();
560 if (ret == 0) goto lab2;
561 if (ret < 0) return ret;
562 }
563 return 0;
564 lab2:
565 c = l - m2;
566 }
567 }
568 lab0:
569 { int ret = slice_del();
570 if (ret < 0) return ret;
571 }
572 return 1;
573 }
574
r_Step_5b()575 int Xapian::InternalStemPorter::r_Step_5b() {
576 ket = c;
577 if (c <= lb || p[c - 1] != 'l') return 0;
578 c--;
579 bra = c;
580 { int ret = r_R2();
581 if (ret <= 0) return ret;
582 }
583 if (c <= lb || p[c - 1] != 'l') return 0;
584 c--;
585 { int ret = slice_del();
586 if (ret < 0) return ret;
587 }
588 return 1;
589 }
590
stem()591 int Xapian::InternalStemPorter::stem() {
592 I_Y_found = 0;
593 { int c1 = c;
594 bra = c;
595 if (c == l || p[c] != 'y') goto lab0;
596 c++;
597 ket = c;
598 { int ret = slice_from_s(1, s_21);
599 if (ret < 0) return ret;
600 }
601 I_Y_found = 1;
602 lab0:
603 c = c1;
604 }
605 { int c2 = c;
606 while(1) {
607 int c3 = c;
608 while(1) {
609 int c4 = c;
610 if (in_grouping_U(g_v, 97, 121, 0)) goto lab3;
611 bra = c;
612 if (c == l || p[c] != 'y') goto lab3;
613 c++;
614 ket = c;
615 c = c4;
616 break;
617 lab3:
618 c = c4;
619 { int ret = skip_utf8(p, c, 0, l, 1);
620 if (ret < 0) goto lab2;
621 c = ret;
622 }
623 }
624 { int ret = slice_from_s(1, s_22);
625 if (ret < 0) return ret;
626 }
627 I_Y_found = 1;
628 continue;
629 lab2:
630 c = c3;
631 break;
632 }
633 c = c2;
634 }
635 I_p1 = l;
636 I_p2 = l;
637 { int c5 = c;
638 {
639 int ret = out_grouping_U(g_v, 97, 121, 1);
640 if (ret < 0) goto lab4;
641 c += ret;
642 }
643 {
644 int ret = in_grouping_U(g_v, 97, 121, 1);
645 if (ret < 0) goto lab4;
646 c += ret;
647 }
648 I_p1 = c;
649 {
650 int ret = out_grouping_U(g_v, 97, 121, 1);
651 if (ret < 0) goto lab4;
652 c += ret;
653 }
654 {
655 int ret = in_grouping_U(g_v, 97, 121, 1);
656 if (ret < 0) goto lab4;
657 c += ret;
658 }
659 I_p2 = c;
660 lab4:
661 c = c5;
662 }
663 lb = c; c = l;
664
665 { int m6 = l - c; (void)m6;
666 { int ret = r_Step_1a();
667 if (ret < 0) return ret;
668 }
669 c = l - m6;
670 }
671 { int m7 = l - c; (void)m7;
672 { int ret = r_Step_1b();
673 if (ret < 0) return ret;
674 }
675 c = l - m7;
676 }
677 { int m8 = l - c; (void)m8;
678 { int ret = r_Step_1c();
679 if (ret < 0) return ret;
680 }
681 c = l - m8;
682 }
683 { int m9 = l - c; (void)m9;
684 { int ret = r_Step_2();
685 if (ret < 0) return ret;
686 }
687 c = l - m9;
688 }
689 { int m10 = l - c; (void)m10;
690 { int ret = r_Step_3();
691 if (ret < 0) return ret;
692 }
693 c = l - m10;
694 }
695 { int m11 = l - c; (void)m11;
696 { int ret = r_Step_4();
697 if (ret < 0) return ret;
698 }
699 c = l - m11;
700 }
701 { int m12 = l - c; (void)m12;
702 { int ret = r_Step_5a();
703 if (ret < 0) return ret;
704 }
705 c = l - m12;
706 }
707 { int m13 = l - c; (void)m13;
708 { int ret = r_Step_5b();
709 if (ret < 0) return ret;
710 }
711 c = l - m13;
712 }
713 c = lb;
714 { int c14 = c;
715 if (!(I_Y_found)) goto lab5;
716 while(1) {
717 int c15 = c;
718 while(1) {
719 int c16 = c;
720 bra = c;
721 if (c == l || p[c] != 'Y') goto lab7;
722 c++;
723 ket = c;
724 c = c16;
725 break;
726 lab7:
727 c = c16;
728 { int ret = skip_utf8(p, c, 0, l, 1);
729 if (ret < 0) goto lab6;
730 c = ret;
731 }
732 }
733 { int ret = slice_from_s(1, s_23);
734 if (ret < 0) return ret;
735 }
736 continue;
737 lab6:
738 c = c15;
739 break;
740 }
741 lab5:
742 c = c14;
743 }
744 return 1;
745 }
746
InternalStemPorter()747 Xapian::InternalStemPorter::InternalStemPorter()
748 : I_Y_found(0), I_p2(0), I_p1(0)
749 {
750 }
751
~InternalStemPorter()752 Xapian::InternalStemPorter::~InternalStemPorter()
753 {
754 }
755
756 std::string
get_description() const757 Xapian::InternalStemPorter::get_description() const
758 {
759 return "porter";
760 }
761