Changeset f7cd7c9


Ignore:
Timestamp:
Jan 9, 2010, 4:02:47 PM (10 years ago)
Author:
Anders Kaseorg <andersk@mit.edu>
Branches:
master, release-1.6, release-1.7, release-1.8, release-1.9
Children:
366558f
Parents:
8a16704
git-author:
Anders Kaseorg <andersk@mit.edu> (01/09/10 03:19:26)
git-committer:
Anders Kaseorg <andersk@mit.edu> (01/09/10 16:02:47)
Message:
owl_text_expand_tabs, meet multibyte and wide characters.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • tester.c

    ra999d9e rf7cd7c9  
    7474  FAIL_UNLESS("expand_tabs 3",
    7575              !strcmp("                2 tabs", owl_text_expand_tabs("\t\t2 tabs")));
     76  FAIL_UNLESS("expand_tabs 4",
     77              !strcmp("α       ααααααα!        ", owl_text_expand_tabs("α\tααααααα!\t")));
     78  FAIL_UNLESS("expand_tabs 5",
     79              !strcmp("A      AAA!!        ", owl_text_expand_tabs("A\tAAA!!\t")));
    7680
    7781  FAIL_UNLESS("skiptokens 1",
  • text.c

    rebbeb39 rf7cd7c9  
    131131char *owl_text_expand_tabs(const char *in)
    132132{
    133   int ntabs = 0;
     133  int len = 0;
    134134  const char *p = in;
    135135  char *ret, *out;
    136136  int col;
    137137
     138  col = 0;
    138139  while(*p) {
    139     if (*(p++) == '\t') ntabs++;
    140   }
    141 
    142   ret = owl_malloc(strlen(in) + 1 + OWL_TAB_WIDTH * ntabs);
     140    gunichar c = g_utf8_get_char(p);
     141    char *q = g_utf8_next_char(p);
     142    switch (c) {
     143    case '\t':
     144      do { len++; col++; } while (col % OWL_TAB_WIDTH);
     145      p = q;
     146      continue;
     147    case '\n':
     148      col = 0;
     149      break;
     150    default:
     151      col += mk_wcwidth(c);
     152      break;
     153    }
     154    len += q - p;
     155    p = q;
     156  }
     157
     158  ret = owl_malloc(len + 1);
    143159
    144160  p = in;
     
    147163  col = 0;
    148164  while(*p) {
    149     switch(*p) {
     165    gunichar c = g_utf8_get_char(p);
     166    char *q = g_utf8_next_char(p);
     167    switch (c) {
    150168    case '\t':
    151169      do {*(out++) = ' '; col++; } while (col % OWL_TAB_WIDTH);
    152       break;
     170      p = q;
     171      continue;
    153172    case '\n':
    154       col = -1;
     173      col = 0;
     174      break;
    155175    default:
    156       col++;
    157       *(out++) = *p;
    158     }
    159     p++;
     176      col += mk_wcwidth(c);
     177      break;
     178    }
     179    memcpy(out, p, q - p);
     180    out += q - p;
     181    p = q;
    160182  }
    161183
Note: See TracChangeset for help on using the changeset viewer.