blob: 7642ea5be5467478b85892754ceccc0f7f2919d0 [file] [log] [blame]
Eitan Isaacson109996e2008-12-20 14:52:53 +00001/* liblouis Braille Translation and Back-Translation Library
2
3 Based on BRLTTY, copyright (C) 1999-2006 by
4 The BRLTTY Team
5
6 Copyright (C) 2004, 2005, 2006
7 ViewPlus Technologies, Inc. www.viewplus.com
8 and
9 JJB Software, Inc. www.jjb-software.com
10
11 This file is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2, or (at your option) any
14 later version.
15
16 In addition to the permissions in the GNU General Public License, the
17 copyright holders give you unlimited permission to link the
18 compiled version of this file into combinations with other programs,
19 and to distribute those combinations without any restriction coming
20 from the use of this file. (The General Public License restrictions
21 do apply in other respects; for example, they cover modification of
22 the file, and distribution when not linked into a combine
23 executable.)
24
25 This file is distributed in the hope that it will be useful, but
26 WITHOUT ANY WARRANTY; without even the implied warranty of
27 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 General Public License for more details.
29
30 You should have received a copy of the GNU General Public License
31 along with this program; see the file COPYING. If not, write to
32 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
33 Boston, MA 02110-1301, USA.
34
35 Maintained by John J. Boyer john.boyer@jjb-software.com
36 */
37
38#include <stdio.h>
39#include <string.h>
40#include <stdlib.h>
41#include "louis.h"
42#define BUFSIZE 256
43
John Boyer16689ac2009-01-12 15:11:39 +000044static const TranslationTableHeader *table;
Eitan Isaacson109996e2008-12-20 14:52:53 +000045static char inputBuffer[BUFSIZE];
46
47static int
Eitan Isaacson109996e2008-12-20 14:52:53 +000048getInput (void)
49{
John Boyer16689ac2009-01-12 15:11:39 +000050 int inputLength;
51 inputBuffer[0] = 0;
Eitan Isaacson109996e2008-12-20 14:52:53 +000052 fgets (inputBuffer, sizeof (inputBuffer), stdin);
John Boyer16689ac2009-01-12 15:11:39 +000053 inputLength = strlen (inputBuffer) - 1;
54 if (inputLength < 0) /*EOF on script */
55 exit (0);
56 inputBuffer[inputLength] = 0;
57 return inputLength;
Eitan Isaacson109996e2008-12-20 14:52:53 +000058}
59
60static int
61getYN (void)
62{
63 printf ("? y/n: ");
64 getInput ();
65 if (inputBuffer[0] == 'y')
66 return 1;
67 return 0;
68}
69
John Boyer16689ac2009-01-12 15:11:39 +000070static int
71printRule (TranslationTableRule * thisRule, int mode)
72{
73 printf ("Rule: ");
74 printf ("opcode=%s, ", findOpcodeName (thisRule->opcode));
75 if (thisRule->before)
76 printf ("before=%x, ", thisRule->before);
77 if (thisRule->after)
78 printf ("after=%x, ", thisRule->after);
79 switch (thisRule->opcode)
80 {
81 case CTO_Context:
82 case CTO_Correct:
83 case CTO_SwapCd:
84 case CTO_SwapDd:
85 case CTO_Pass2:
86 case CTO_Pass3:
87 case CTO_Pass4:
88 printf ("code=%s ", showString (thisRule->charsdots, thisRule->charslen
89 + thisRule->dotslen));
90 break;
91 default:
92 if (mode == 0)
93 {
94 printf ("chars=%s, ", showString (thisRule->charsdots,
95 thisRule->charslen));
96 printf ("dots=%s, ",
97 showDots (&thisRule->charsdots[thisRule->charslen],
98 thisRule->dotslen));
99 }
100 else
101 {
102 printf ("dots=%s, ",
103 showDots (&thisRule->charsdots[thisRule->charslen],
104 thisRule->dotslen));
105 printf ("chars=%s, ", showString (thisRule->charsdots,
106 thisRule->charslen));
107 }
108 break;
109 }
110 return 1;
111}
112
113static int
114printCharacter (TranslationTableCharacter * thisChar, int mode)
115{
116 TranslationTableRule *thisRule;
117 TranslationTableOffset nextRule;
118 if (mode == 0)
119 {
120 printf ("Char: ");
121 printf ("real=%s, ", showString (&thisChar->realchar, 1));
122 printf ("upper=%s, ", showString (&thisChar->uppercase, 1));
123 printf ("lower=%s, ", showString (&thisChar->lowercase, 1));
124 }
125 else
126 printf ("Dots: real=%s, ", showDots (&thisChar->realchar, 1));
127 printf ("attr=%s, ", showAttributes (thisChar->attributes));
128 nextRule = thisChar->otherRules;
129 while (nextRule)
130 {
131 thisRule = (TranslationTableRule *) & table->ruleArea[nextRule];
John Boyerc675d7a2009-01-15 14:32:20 +0000132 if (nextRule == thisChar->definitionRule)
John Boyer16689ac2009-01-12 15:11:39 +0000133 printf ("definition ");
134 printRule (thisRule, mode);
135 printf ("\n");
136 if (mode == 0)
137 nextRule = thisRule->charsnext;
138 else
139 nextRule = thisRule->dotsnext;
140 }
141 return 1;
142}
143
144static int
145show_characters (int startHash)
146{
147 int k;
148 TranslationTableCharacter *thisChar;
149 TranslationTableOffset nextChar;
150 printf ("Press enter for next or (e)xit, next-(h)ash, then enter\n");
151 if (startHash < 0)
152 k = 0;
153 else
154 k = startHash;
155 for (; k < HASHNUM; k++)
156 if (table->characters[k])
157 {
158 printf ("Hash=%d\n", k);
159 nextChar = table->characters[k];
160 while (nextChar)
161 {
162 thisChar =
163 (TranslationTableCharacter *) & table->ruleArea[nextChar];
164 printCharacter (thisChar, 0);
165 printf ("=> ");
166 getInput ();
167 if (*inputBuffer == 'h')
168 break;
169 if (*inputBuffer == 'e')
170 return 1;
171 nextChar = thisChar->next;
172 }
173 }
174 return 1;
175}
176
177static int
178show_dots (int startHash)
179{
180 int k;
181 TranslationTableCharacter *thisDots;
182 TranslationTableOffset nextDots;
183 printf ("Press enter for next or (e)xit, next-(h)ash, then enter\n");
184 if (startHash < 0)
185 k = 0;
186 else
187 k = startHash;
188 for (; k < HASHNUM; k++)
189 if (table->dots[k])
190 {
191 printf ("Hash=%d\n", k);
192 nextDots = table->dots[k];
193 while (nextDots)
194 {
195 thisDots =
196 (TranslationTableCharacter *) & table->ruleArea[nextDots];
197 printCharacter (thisDots, 1);
198 printf ("=> ");
199 getInput ();
200 if (*inputBuffer == 'h')
201 break;
202 if (*inputBuffer == 'e')
203 return 1;
204 nextDots = thisDots->next;
205 }
206 }
207 return 1;
208}
209
210static int
211show_forRules (int startHash)
212{
213 int k;
214 TranslationTableRule *thisRule;
215 TranslationTableOffset nextRule;
216 printf ("Press enter for next or (e)xit, next-(h)ash, then enter\n");
217 if (startHash < 0)
218 k = 0;
219 else
220 k = startHash;
221 for (; k < HASHNUM; k++)
222 if (table->forRules[k])
223 {
224 printf ("Hash=%d\n", k);
225 nextRule = table->forRules[k];
226 while (nextRule)
227 {
228 thisRule = (TranslationTableRule *) & table->ruleArea[nextRule];
229 printRule (thisRule, 0);
230 printf ("=> ");
231 getInput ();
232 if (*inputBuffer == 'h')
233 break;
234 if (*inputBuffer == 'e')
235 return 1;
236 nextRule = thisRule->charsnext;
237 }
238 }
239 return 1;
240}
241
242static int
243show_backRules (int startHash)
244{
245 int k;
246 TranslationTableRule *thisRule;
247 TranslationTableOffset nextRule;
248 printf ("Press enter for next or (e)xit, next-(h)ash, then enter\n");
249 if (startHash < 0)
250 k = 0;
251 else
252 k = startHash;
253 for (; k < HASHNUM; k++)
254 if (table->backRules[k])
255 {
256 printf ("Hash=%d\n", k);
257 nextRule = table->backRules[k];
258 while (nextRule)
259 {
260 thisRule = (TranslationTableRule *) & table->ruleArea[nextRule];
261 printRule (thisRule, 1);
262 printf ("=> ");
263 getInput ();
264 if (*inputBuffer == 'h')
265 break;
266 if (*inputBuffer == 'e')
267 return 1;
268 nextRule = thisRule->dotsnext;
269 }
270 }
271 return 1;
272}
273
274static int
275print_brailleIndicator (TranslationTableOffset offset, char *opcode)
276{
277 TranslationTableRule *thisRule;
278 if (!offset)
279 return 0;
280 thisRule = (TranslationTableRule *) & table->ruleArea[offset];
281 printf ("%s %s\n", opcode,
282 showDots (&thisRule->charsdots[0], thisRule->dotslen));
283 return 1;
284}
285
286static int
287print_phraseLength (TranslationTableOffset offset, char *opcode)
288{
289 if (!offset)
290 return 0;
291 printf ("%s %d\n", opcode, offset);
292}
293
294static int
295show_brailleIndicators (void)
296{
297 print_brailleIndicator (table->capitalSign, "capsign");
298 print_brailleIndicator (table->beginCapitalSign, "begcaps");
299 print_phraseLength (table->lenBeginCaps, "lenbegcaps");
300 print_brailleIndicator (table->endCapitalSign, "endcaps");
301 print_brailleIndicator (table->firstWordCaps, "firstwordcaps");
302 print_brailleIndicator (table->lastWordCapsAfter, "lastwordaftercaps");
303 print_phraseLength (table->lenCapsPhrase, "lencapsphrase");
304 print_brailleIndicator (table->letterSign, "letsign");
305 print_brailleIndicator (table->numberSign, "numsign");
306 print_brailleIndicator (table->firstWordItal, "firstwordital");
307 print_brailleIndicator (table->lastWordItalBefore, "lastworditalbefore");
308 print_brailleIndicator (table->lastWordItalAfter, "lastworditalafter");
309 print_brailleIndicator (table->firstLetterItal, "firstletterital");
310 print_brailleIndicator (table->lastLetterItal, "lastletterital");
311 print_brailleIndicator (table->singleLetterItal, "singleletterital");
312 print_brailleIndicator (table->italWord, "italword");
313 print_phraseLength (table->lenItalPhrase, "lenitalphrase");
314 print_brailleIndicator (table->firstWordBold, "firstwordbold");
315 print_brailleIndicator (table->lastWordBoldBefore, "lastwordboldbefore");
316 print_brailleIndicator (table->lastWordBoldAfter, "lastwordboldafter");
317 print_brailleIndicator (table->firstLetterBold, "firstletterbold");
318 print_brailleIndicator (table->lastLetterBold, "lastletterbold");
319 print_brailleIndicator (table->singleLetterBold, "singleletterbold");
320 print_brailleIndicator (table->boldWord, "boldword");
321 print_phraseLength (table->lenBoldPhrase, "lenboldphrase");
322 print_brailleIndicator (table->firstWordUnder, "firstwordunder");
323 print_brailleIndicator (table->lastWordUnderBefore, "lastwordunderbefore");
324 print_brailleIndicator (table->lastWordUnderAfter, "lastwordunderafter");
325 print_brailleIndicator (table->firstLetterUnder, "firstletterunder");
326 print_brailleIndicator (table->lastLetterUnder, "lastletterunder");
327 print_brailleIndicator (table->singleLetterUnder, "singleletterunder");
328 print_brailleIndicator (table->underWord, "underword");
329 print_phraseLength (table->lenUnderPhrase, "lenunderphrase");
330 print_brailleIndicator (table->begComp, "begcomp");
331 print_brailleIndicator (table->compBegEmph1, "compbegemph1");
332 print_brailleIndicator (table->compEndEmph1, "compendemph1");
333 print_brailleIndicator (table->compBegEmph2, "compbegemph2");
334 print_brailleIndicator (table->compEndEmph2, "compendemph2");
335 print_brailleIndicator (table->compBegEmph3, "compbegemph3");
336 print_brailleIndicator (table->compEndEmph3, "compendemph3");
337 print_brailleIndicator (table->compCapSign, "compcapsign");
338 print_brailleIndicator (table->compBegCaps, "compbegcaps");
339 print_brailleIndicator (table->compEndCaps, "compendcaps");
340 print_brailleIndicator (table->endComp, "endcomp");
341 return 1;
342}
343
344static char *
345pickYN (int a)
346{
347 if (!a)
348 return "no";
349 return "yes";
350}
351
352static int
353show_misc (void)
354{
355 printf ("Table size: %d\n", table->tableSize);
356 printf ("Bytes used: %d\n", table->bytesUsed);
357 printf ("Number of passes: %d\n", table->numPasses);
358 printf ("'coreect' opcodes: %s\n", pickYN (table->corrections));
359 printf ("'syllable' opcodes: %s\n", pickYN (table->syllables));
360 printf ("'capsnocont' opcode: %s\n", pickYN (table->capsNoCont));
361 printf ("Hyphenation table: %s\n", pickYN (table->hyphenStatesArray));
362 printf ("noletsignbefore %s\n", showString (&table->noLetsignBefore[0],
363 table->noLetsignBeforeCount));
364 printf ("noletsign %s\n", showString (&table->noLetsign[0],
365 table->noLetsignCount));
366 printf ("noletsignafter %s\n", showString (&table->noLetsignAfter[0],
367 table->noLetsignAfterCount));
368}
369
370static int
371show_charMap (int startHash)
372{
373 int k;
374 CharOrDots *thisChar;
375 TranslationTableOffset nextChar;
376 printf ("Press enter for next or (e)xit, next-(h)ash, then enter\n");
377 if (startHash < 0)
378 k = 0;
379 else
380 k = startHash;
381 for (; k < HASHNUM; k++)
382 if (table->charToDots[k])
383 {
384 printf ("Hash=%d\n", k);
385 nextChar = table->charToDots[k];
386 while (nextChar)
387 {
388 thisChar = (CharOrDots *) & table->ruleArea[nextChar];
389 printf ("Char: %s ", showString (&thisChar->lookFor, 1));
390 printf ("dots=%s\n", showDots (&thisChar->found, 1));
391 printf ("=> ");
392 getInput ();
393 if (*inputBuffer == 'h')
394 break;
395 if (*inputBuffer == 'e')
396 return 1;
397 nextChar = thisChar->next;
398 }
399 }
400 return 1;
401}
402
403static int
404show_dotsMap (int startHash)
405{
406 int k;
407 CharOrDots *thisDots;
408 TranslationTableOffset nextDots;
409 printf ("Press enter for next or (e)xit, next-(h)ash, then enter\n");
410 if (startHash < 0)
411 k = 0;
412 else
413 k = startHash;
414 for (; k < HASHNUM; k++)
415 if (table->dotsToChar[k])
416 {
417 printf ("Hash=%d\n", k);
418 nextDots = table->dotsToChar[k];
419 while (nextDots)
420 {
421 thisDots = (CharOrDots *) & table->ruleArea[nextDots];
422 printf ("Dots: %s ", showDots (&thisDots->lookFor, 1));
423 printf ("char=%s\n", showString (&thisDots->found, 1));
424 printf ("=> ");
425 getInput ();
426 if (*inputBuffer == 'h')
427 break;
428 if (*inputBuffer == 'e')
429 return 1;
430 nextDots = thisDots->next;
431 }
432 }
433 return 1;
434}
435
436static int
437show_compDots (int startChar)
438{
439 widechar k;
440 printf ("Press enter for next or (e)xit, next-(h)ash, then enter\n");
441 if (startChar < 0)
442 k = 0;
443 else
444 k = startChar;
445 for (; k < 256; k++)
446 if (table->compdotsPattern[k])
447 {
448 TranslationTableRule *thisRule = (TranslationTableRule *)
449 & table->ruleArea[table->compdotsPattern[k]];
450 printf ("Char: %s ", showString (&k, 1));
451 printf ("dots=%s\n",
452 showDots (&thisRule->charsdots[1], thisRule->dotslen));
453 printf ("=> ");
454 getInput ();
455 if (*inputBuffer == 'e')
456 return 1;
457 }
458 return 1;
459}
460
461static void
462part_paramLetters ()
463{
464 printf ("show particular hash chains.\n");
465 printf
466 ("show-(f)orward-rules, show-(b)ackward-rules, show-(c)haracters, \n");
467 printf ("show-(d)ot-patterns, show-(C)har-to-dots, show-(D)ots-tochar\n");
468 printf ("(z)-compdots, (h)elp, e(x)it\n");
469}
470
471static void
472particularHelp (void)
473{
474 part_paramLetters ();
475}
476
477static int
478particular (void)
479{
480 int startHash;
481 widechar parsed[BUFSIZE];
482 part_paramLetters ();
483 do
484 {
485 printf ("particular: ");
486 getInput ();
487 switch (inputBuffer[0])
488 {
489 case 0:
490 break;
491 case 'h':
492 particularHelp ();
493 break;
494 case 'c':
495 printf ("-> ");
496 getInput ();
497 if (!extParseChars (inputBuffer, parsed))
498 break;
499 startHash = charHash (*parsed);
500 if (table->characters[startHash] == 0)
501 {
502 printf ("Character not in table.\n");
503 break;
504 }
505 show_characters (startHash);
506 break;
507 case 'd':
508 printf ("-> ");
509 getInput ();
510 if (!extParseDots (inputBuffer, parsed))
511 break;
512 startHash = charHash (*parsed);
513 if (table->dots[startHash] == 0)
514 {
515 printf ("Dot pattern not in table.\n");
516 break;
517 }
518 show_dots (startHash);
519 break;
520 case 'C':
521 printf ("-> ");
522 getInput ();
523 if (!extParseChars (inputBuffer, parsed))
524 break;
525 startHash = charHash (*parsed);
526 if (table->charToDots[startHash] == 0)
527 {
528 printf ("Character not in table.\n");
529 break;
530 }
531 show_charMap (startHash);
532 break;
533 case 'D':
534 printf ("-> ");
535 getInput ();
536 if (!extParseDots (inputBuffer, parsed))
537 break;
538 startHash = charHash (*parsed);
539 if (table->dotsToChar[startHash] == 0)
540 {
541 printf ("Dot pattern not in table.\n");
542 break;
543 }
544 show_dotsMap (startHash);
545 break;
546 case 'f':
547 printf ("-> ");
548 getInput ();
549 if (!extParseChars (inputBuffer, parsed))
550 break;
551 startHash = stringHash (parsed);
552 if (table->forRules[startHash] == 0)
553 {
554 printf ("Character string not in table.\n");
555 break;
556 }
557 show_forRules (startHash);
558 break;
559 case 'b':
560 printf ("-> ");
561 getInput ();
562 if (!extParseDots (inputBuffer, parsed))
563 break;
564 startHash = stringHash (parsed);
565 if (table->backRules[startHash] == 0)
566 {
567 printf ("Dot pattern not in table.\n");
568 break;
569 }
570 show_backRules (startHash);
571 break;
572 case 'z':
573 printf ("-> ");
574 getInput ();
575 if (!extParseChars (inputBuffer, parsed))
576 break;
577 startHash = charHash (*parsed);
578 if (*parsed > 255 || table->compdotsPattern[startHash] == 0)
579 {
580 printf ("Character not in table.\n");
581 break;
582 }
583 show_compDots (startHash);
584 break;
585 case 'x':
586 return 1;
587 default:
588 printf ("Bad choice.\n");
589 break;
590 }
591 }
592 while (inputBuffer[0] != 'x');
593 return 1;
594}
595
Eitan Isaacson109996e2008-12-20 14:52:53 +0000596static void
597paramLetters (void)
598{
John Boyer16689ac2009-01-12 15:11:39 +0000599 printf ("Press one of the letters in parentheses, then enter.\n");
600 printf
601 ("show-(f)orward-rules, show-(b)ackward-rules, show-(c)haracters, \n");
602 printf ("show-(d)ot-patterns, show-(C)har-to-dots, show-(D)ots-tochar\n");
603 printf ("show-(m)isc, show-(z)-compdots\n");
604 printf ("show-(p)articulars, (h)elp, (q)uit\n");
605}
606
607static void
608commandHelp (void)
609{
610 paramLetters ();
Eitan Isaacson109996e2008-12-20 14:52:53 +0000611}
612
613static int
614getCommands (void)
615{
616 paramLetters ();
617 do
618 {
619 printf ("Command: ");
620 getInput ();
621 switch (inputBuffer[0])
622 {
623 case 0:
624 break;
John Boyer16689ac2009-01-12 15:11:39 +0000625 case 'h':
626 commandHelp ();
627 break;
628 case 'C':
629 show_charMap (-1);
630 break;
631 case 'D':
632 show_dotsMap (-1);
633 break;
634 case 'z':
635 show_compDots (-1);
636 break;
637 case 'c':
638 show_characters (-1);
639 break;
640 case 'd':
641 show_dots (-1);
642 break;
643 case 'f':
644 show_forRules (-1);
645 break;
646 case 'b':
647 show_backRules (-1);
648 break;
649 case 'i':
650 show_brailleIndicators ();
651 break;
652 case 'm':
653 show_misc ();
654 break;
655 case 'p':
656 particular ();
657 break;
658 case 'q':
659 return 1;
Eitan Isaacson109996e2008-12-20 14:52:53 +0000660 default:
661 printf ("Bad choice.\n");
662 break;
663 }
664 }
John Boyer16689ac2009-01-12 15:11:39 +0000665 while (inputBuffer[0] != 'q');
Eitan Isaacson109996e2008-12-20 14:52:53 +0000666 return 1;
667}
668
669int
670main (int argc, char **argv)
671{
Eitan Isaacson109996e2008-12-20 14:52:53 +0000672 if (argc != 2)
673 {
674 fprintf (stderr, "Usage: lou_debug tablename\n");
675 exit (1);
676 }
677 if (!(table = lou_getTable (argv[1])))
John Boyer16689ac2009-01-12 15:11:39 +0000678 {
679 lou_free ();
680 return 1;
681 }
682 getCommands ();
Eitan Isaacson109996e2008-12-20 14:52:53 +0000683 lou_free ();
Eitan Isaacson109996e2008-12-20 14:52:53 +0000684 return 0;
685}