aboutsummaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
authorTomas Heinrich <heinrich.tomas@gmail.com>2010-01-04 16:21:31 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2010-01-04 16:21:31 +0100
commitd2b1ba6fdee59645763e915ade3ec55e67d5839a (patch)
tree9b1a97996255647452851908dc76e4e91a57420b /coreutils
parent4928f3b90b3925e6f3cc234df48e46f88fc5689b (diff)
downloadbusybox-w32-d2b1ba6fdee59645763e915ade3ec55e67d5839a.tar.gz
busybox-w32-d2b1ba6fdee59645763e915ade3ec55e67d5839a.tar.bz2
busybox-w32-d2b1ba6fdee59645763e915ade3ec55e67d5839a.zip
[un]expand: unicode support
function old new delta expand_main 633 663 +30 Signed-off-by: Tomas Heinrich <heinrich.tomas@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils')
-rw-r--r--coreutils/expand.c51
1 files changed, 33 insertions, 18 deletions
diff --git a/coreutils/expand.c b/coreutils/expand.c
index 7137c3b89..e08eb1d0a 100644
--- a/coreutils/expand.c
+++ b/coreutils/expand.c
@@ -20,8 +20,8 @@
20 * 20 *
21 * Caveat: this versions of expand and unexpand don't accept tab lists. 21 * Caveat: this versions of expand and unexpand don't accept tab lists.
22 */ 22 */
23
24#include "libbb.h" 23#include "libbb.h"
24#include "unicode.h"
25 25
26enum { 26enum {
27 OPT_INITIAL = 1 << 0, 27 OPT_INITIAL = 1 << 0,
@@ -30,35 +30,37 @@ enum {
30}; 30};
31 31
32#if ENABLE_EXPAND 32#if ENABLE_EXPAND
33static void expand(FILE *file, int tab_size, unsigned opt) 33static void expand(FILE *file, unsigned tab_size, unsigned opt)
34{ 34{
35 char *line; 35 char *line;
36 36
37 tab_size = -tab_size;
38
39 while ((line = xmalloc_fgets(file)) != NULL) { 37 while ((line = xmalloc_fgets(file)) != NULL) {
40 int pos;
41 unsigned char c; 38 unsigned char c;
42 char *ptr = line; 39 char *ptr;
40 char *ptr_strbeg;
43 41
44 goto start; 42 ptr = ptr_strbeg = line;
45 while ((c = *ptr) != '\0') { 43 while ((c = *ptr) != '\0') {
46 if ((opt & OPT_INITIAL) && !isblank(c)) { 44 if ((opt & OPT_INITIAL) && !isblank(c)) {
47 fputs(ptr, stdout); 45 /* not space or tab */
48 break; 46 break;
49 } 47 }
50 ptr++;
51 if (c == '\t') { 48 if (c == '\t') {
52 c = ' '; 49 unsigned len;
53 while (++pos < 0) 50 *ptr = '\0';
54 bb_putchar(c); 51# if ENABLE_FEATURE_ASSUME_UNICODE
55 } 52 len = bb_mbstrlen(ptr_strbeg);
56 bb_putchar(c); 53# else
57 if (++pos >= 0) { 54 len = ptr - ptr_strbeg;
58 start: 55# endif
59 pos = tab_size; 56 len = tab_size - (len % tab_size);
57 /*while (ptr[1] == '\t') { ptr++; len += tab_size; } - can handle many tabs at once */
58 printf("%s%*s", ptr_strbeg, len, "");
59 ptr_strbeg = ptr + 1;
60 } 60 }
61 ptr++;
61 } 62 }
63 fputs(ptr_strbeg, stdout);
62 free(line); 64 free(line);
63 } 65 }
64} 66}
@@ -75,6 +77,7 @@ static void unexpand(FILE *file, unsigned tab_size, unsigned opt)
75 77
76 while (*ptr) { 78 while (*ptr) {
77 unsigned n; 79 unsigned n;
80 unsigned len;
78 81
79 while (*ptr == ' ') { 82 while (*ptr == ' ') {
80 column++; 83 column++;
@@ -97,8 +100,19 @@ static void unexpand(FILE *file, unsigned tab_size, unsigned opt)
97 } 100 }
98 n = strcspn(ptr, "\t "); 101 n = strcspn(ptr, "\t ");
99 printf("%*s%.*s", column, "", n, ptr); 102 printf("%*s%.*s", column, "", n, ptr);
103# if ENABLE_FEATURE_ASSUME_UNICODE
104 {
105 char c;
106 c = ptr[n];
107 ptr[n] = '\0';
108 len = bb_mbstrlen(ptr);
109 ptr[n] = c;
110 }
111# else
112 len = n;
113# endif
100 ptr += n; 114 ptr += n;
101 column = (column + n) % tab_size; 115 column = (column + len) % tab_size;
102 } 116 }
103 free(line); 117 free(line);
104 } 118 }
@@ -130,6 +144,7 @@ int expand_main(int argc UNUSED_PARAM, char **argv)
130 "all\0" No_argument "a" 144 "all\0" No_argument "a"
131 ; 145 ;
132#endif 146#endif
147 check_unicode_in_env();
133 148
134 if (ENABLE_EXPAND && (!ENABLE_UNEXPAND || applet_name[0] == 'e')) { 149 if (ENABLE_EXPAND && (!ENABLE_UNEXPAND || applet_name[0] == 'e')) {
135 IF_FEATURE_EXPAND_LONG_OPTIONS(applet_long_options = expand_longopts); 150 IF_FEATURE_EXPAND_LONG_OPTIONS(applet_long_options = expand_longopts);