tr.c revision 663860b1408516d02ebfcb3a9999a134e6cfb223
1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include<stdio.h>
2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include<stdlib.h>
3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include<asm/types.h>
4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include<stdint.h>
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include<string.h>
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "table.h"
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochuint8_t buff[40];
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid tr(uint8_t *codepage, uint8_t *addr, uint64_t len)
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch{
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch   asm volatile(
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "   larl    1,1f\n"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "1: tr      0(1,%0),0(%2)\n"
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "   ex      %1,0(1)"
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                : "+&a" (addr), "+a" (len)
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                : "a" (codepage) : "cc", "memory", "1");
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
20void run_test(void *tran_table, void *srcaddr, uint64_t len)
21{
22   int i;
23
24   tr(tran_table, buff, len);
25   printf("the translated string is ");
26   for (i = 0; i < len; i++) {
27      printf("%c", buff[i]);
28   }
29   printf("\n");
30}
31
32int main()
33{
34   /* Test 1: length = 0 */
35   run_test((char *)&touppercase, &buff, 0);
36   run_test((char *)&touppercase, &buff, 0);
37
38   /* Test 2 : length > 0 */
39   memset(buff, 'a', 1);
40   run_test((char *)&touppercase, &buff, 1);
41
42   memcpy(buff, "abcdefgh", 8);
43   run_test((char *)&touppercase, &buff, 3);
44   run_test((char *)&touppercase, &buff, 3);
45   run_test((char *)&touppercase, &buff, 8);
46
47   memcpy(buff, "ABCDEFGH", 8);
48   run_test((char *)&tolowercase, &buff, 3);
49   run_test((char *)&tolowercase, &buff, 3);
50   run_test((char *)&tolowercase, &buff, 8);
51
52   memcpy(buff, "0123456789", 9);
53   run_test((char *)&touppercase, &buff, 9);
54   run_test((char *)&tolowercase, &buff, 9);
55   return 0;
56}
57