1 /* $NetBSD: translit.c,v 1.1.1.1 2009/06/23 10:09:01 tron Exp $ */
2
3 /*++
4 /* NAME
5 /* translit 3
6 /* SUMMARY
7 /* transliterate characters
8 /* SYNOPSIS
9 /* #include <stringops.h>
10 /*
11 /* char *translit(buf, original, replacement)
12 /* char *buf;
13 /* char *original;
14 /* char *replacement;
15 /* DESCRIPTION
16 /* translit() takes a null-terminated string, and replaces characters
17 /* given in its \fIoriginal\fR argument by the corresponding characters
18 /* in the \fIreplacement\fR string. The result value is the \fIbuf\fR
19 /* argument.
20 /* BUGS
21 /* Cannot replace null characters.
22 /* LICENSE
23 /* .ad
24 /* .fi
25 /* The Secure Mailer license must be distributed with this software.
26 /* AUTHOR(S)
27 /* Wietse Venema
28 /* IBM T.J. Watson Research
29 /* P.O. Box 704
30 /* Yorktown Heights, NY 10598, USA
31 /*--*/
32
33 /* System library. */
34
35 #include "sys_defs.h"
36 #include <string.h>
37
38 /* Utility library. */
39
40 #include "stringops.h"
41
translit(char * string,const char * original,const char * replacement)42 char *translit(char *string, const char *original, const char *replacement)
43 {
44 char *cp;
45 const char *op;
46
47 /*
48 * For large inputs, should use a lookup table.
49 */
50 for (cp = string; *cp != 0; cp++) {
51 for (op = original; *op != 0; op++) {
52 if (*cp == *op) {
53 *cp = replacement[op - original];
54 break;
55 }
56 }
57 }
58 return (string);
59 }
60
61 #ifdef TEST
62
63 /*
64 * Usage: translit string1 string2
65 *
66 * test program to perform the most basic operation of the UNIX tr command.
67 */
68 #include <msg.h>
69 #include <vstring.h>
70 #include <vstream.h>
71 #include <vstring_vstream.h>
72
73 #define STR vstring_str
74
main(int argc,char ** argv)75 int main(int argc, char **argv)
76 {
77 VSTRING *buf = vstring_alloc(100);
78
79 if (argc != 3)
80 msg_fatal("usage: %s string1 string2", argv[0]);
81 while (vstring_fgets(buf, VSTREAM_IN))
82 vstream_fputs(translit(STR(buf), argv[1], argv[2]), VSTREAM_OUT);
83 vstream_fflush(VSTREAM_OUT);
84 vstring_free(buf);
85 return (0);
86 }
87
88 #endif
89