Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 69407 | Differences between
and this patch

Collapse All | Expand All

(-)bash-3.0/subst.c.multibyteifs (-6 / +145 lines)
Lines 124-130 Link Here
124
SHELL_VAR *ifs_var;
124
SHELL_VAR *ifs_var;
125
char *ifs_value;
125
char *ifs_value;
126
unsigned char ifs_cmap[UCHAR_MAX + 1];
126
unsigned char ifs_cmap[UCHAR_MAX + 1];
127
#if defined (HANDLE_MULTIBYTE)
128
unsigned char ifs_firstc[MB_LEN_MAX];
129
size_t ifs_firstc_len;
130
#else
127
unsigned char ifs_firstc;
131
unsigned char ifs_firstc;
132
#endif
128
133
129
/* Extern functions and variables from different files. */
134
/* Extern functions and variables from different files. */
130
extern int last_command_exit_value, last_command_exit_signal;
135
extern int last_command_exit_value, last_command_exit_signal;
Lines 862-869 Link Here
862
     char *charlist;
867
     char *charlist;
863
{
868
{
864
  register int i = *sindex;
869
  register int i = *sindex;
870
  size_t slen;
871
#if defined (HANDLE_MULTIBYTE)
872
  size_t clen;
873
  wchar_t *wcharlist = NULL;
874
#endif
865
  int c;
875
  int c;
866
  char *temp;
876
  char *temp;
877
  DECLARE_MBSTATE;
867
878
868
  if (charlist[0] == '\'' && charlist[1] == '\0')
879
  if (charlist[0] == '\'' && charlist[1] == '\0')
869
    {
880
    {
Lines 872-889 Link Here
872
      return temp;
883
      return temp;
873
    }
884
    }
874
885
875
  for (i = *sindex; c = string[i]; i++)
886
  slen = strlen (string + *sindex) + *sindex;
887
  i = *sindex;
888
#if defined (HANDLE_MULTIBYTE)
889
  clen = strlen (charlist);
890
#endif
891
  while ((c = string[i]))
876
    {
892
    {
893
#if defined (HANDLE_MULTIBYTE)
894
      size_t mblength;
895
#endif
896
877
      if (c == CTLESC)
897
      if (c == CTLESC)
878
	{
898
	{
879
	  i++;
899
	  i += 2;
880
	  continue;
900
	  continue;
881
	}
901
	}
882
902
903
#if defined (HANDLE_MULTIBYTE)
904
      mblength = mblen (string + i, slen - i);
905
      if (mblength > 1)
906
	{
907
	  wchar_t wc;
908
	  size_t mblength = mbtowc (&wc, string + i, slen - i);
909
	  if (MB_INVALIDCH (mblength))
910
	    {
911
	      if (MEMBER (c, charlist))
912
		break;
913
	    }
914
	  else
915
	    {
916
	      if (!wcharlist)
917
		{
918
		  size_t len = mbstowcs (wcharlist, charlist, 0);
919
		  if (len == -1)
920
		    len = 0;
921
		  wcharlist = xmalloc (1 + sizeof (wchar_t) * len);
922
		  mbstowcs (wcharlist, charlist, len);
923
		}
924
925
	      if (wcschr (wcharlist, wc))
926
		{
927
		  break;
928
		}
929
	    }
930
	}
931
      else
932
#endif
933
883
      if (MEMBER (c, charlist))
934
      if (MEMBER (c, charlist))
884
	break;
935
	break;
936
937
      ADVANCE_CHAR (string, slen, i);
885
    }
938
    }
886
939
940
#if defined (HANDLE_MULTIBYTE)
941
  if (wcharlist)
942
    free (wcharlist);
943
#endif
944
887
  temp = substring (string, *sindex, i);
945
  temp = substring (string, *sindex, i);
888
  *sindex = i;
946
  *sindex = i;
889
947
Lines 1456-1466 Link Here
1456
  d2 = 0;
1514
  d2 = 0;
1457
  if (delims)
1515
  if (delims)
1458
    {
1516
    {
1459
      d2 = (char *)xmalloc (strlen (delims) + 1);
1517
      size_t slength = strlen (delims);
1460
      for (i = ts = 0; delims[i]; i++)
1518
#if defined (HANDLE_MULTIBYTE)
1519
      size_t mblength = 1;
1520
      DECLARE_MBSTATE;
1521
#endif
1522
1523
      d2 = (char *)xmalloc (slength + 1);
1524
      i = ts = 0;
1525
      while (delims[i])
1461
	{
1526
	{
1527
#if defined (HANDLE_MULTIBYTE)
1528
	  mbstate_t state_bak = state;
1529
	  mblength = mbrlen (delims + i, slength, &state);
1530
1531
	  if (MB_INVALIDCH (mblength))
1532
	    state = state_bak;
1533
	  else if (mblength != 1)
1534
	    {
1535
	      memcpy (d2 + ts, delims + i, mblength);
1536
	      ts += mblength;
1537
	      i += mblength;
1538
	      slength -= mblength;
1539
	      continue;
1540
	    }
1541
#endif
1542
1462
	  if (whitespace(delims[i]) == 0)
1543
	  if (whitespace(delims[i]) == 0)
1463
	    d2[ts++] = delims[i];
1544
	    d2[ts++] = delims[i];
1545
	  i++;
1546
	  slength--;
1464
	}
1547
	}
1465
      d2[ts] = '\0';
1548
      d2[ts] = '\0';
1466
    }
1549
    }
Lines 1654-1663 Link Here
1654
string_list_dollar_star (list)
1737
string_list_dollar_star (list)
1655
     WORD_LIST *list;
1738
     WORD_LIST *list;
1656
{
1739
{
1740
#if defined (HANDLE_MULTIBYTE)
1741
  char sep[MB_CUR_MAX + 1];
1742
#else
1657
  char sep[2];
1743
  char sep[2];
1744
#endif
1658
1745
1746
#if defined (HANDLE_MULTIBYTE)
1747
  memcpy (sep, ifs_firstc, ifs_firstc_len);
1748
  sep[ifs_firstc_len] = '\0';
1749
#else
1659
  sep[0] = ifs_firstc;
1750
  sep[0] = ifs_firstc;
1660
  sep[1] = '\0';
1751
  sep[1] = '\0';
1752
#endif
1661
1753
1662
  return (string_list_internal (list, sep));
1754
  return (string_list_internal (list, sep));
1663
}
1755
}
Lines 1676-1689 Link Here
1676
     WORD_LIST *list;
1768
     WORD_LIST *list;
1677
     int quoted;
1769
     int quoted;
1678
{
1770
{
1679
  char *ifs, sep[2];
1771
  char *ifs;
1772
#if defined (HANDLE_MULTIBYTE)
1773
  char sep[MB_CUR_MAX + 1];
1774
#else
1775
  char sep[2];
1776
#endif
1680
  WORD_LIST *tlist;
1777
  WORD_LIST *tlist;
1681
1778
1682
  /* XXX this could just be ifs = ifs_value; */
1779
  /* XXX this could just be ifs = ifs_value; */
1683
  ifs = ifs_var ? value_cell (ifs_var) : (char *)0;
1780
  ifs = ifs_var ? value_cell (ifs_var) : (char *)0;
1684
1781
1782
#if defined (HANDLE_MULTIBYTE)
1783
  if (ifs && *ifs)
1784
    {
1785
      size_t mblength = mblen (ifs, strnlen (ifs, MB_CUR_MAX));
1786
      if (MB_INVALIDCH (mblength))
1787
	{
1788
	  sep[0] = *ifs;
1789
	  sep[1] = '\0';
1790
	}
1791
      else
1792
	{
1793
	  memcpy (sep, ifs, mblength);
1794
	  sep[mblength] = '\0';
1795
	}
1796
    }
1797
  else
1798
    {
1799
      sep[0] = ' ';
1800
      sep[1] = '\0';
1801
    }
1802
#else
1685
  sep[0] = (ifs == 0 || *ifs == 0) ? ' ' : *ifs;
1803
  sep[0] = (ifs == 0 || *ifs == 0) ? ' ' : *ifs;
1686
  sep[1] = '\0';
1804
  sep[1] = '\0';
1805
#endif
1687
1806
1688
  tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0))
1807
  tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0))
1689
		? quote_list (list)
1808
		? quote_list (list)
Lines 1732-1737 Link Here
1732
  WORD_DESC *t;
1851
  WORD_DESC *t;
1733
  char *current_word, *s;
1852
  char *current_word, *s;
1734
  int sindex, sh_style_split, whitesep;
1853
  int sindex, sh_style_split, whitesep;
1854
  size_t slen = 0;
1735
1855
1736
  if (!string || !*string)
1856
  if (!string || !*string)
1737
    return ((WORD_LIST *)NULL);
1857
    return ((WORD_LIST *)NULL);
Lines 1805-1811 Link Here
1805
1925
1806
      /* Move past the current separator character. */
1926
      /* Move past the current separator character. */
1807
      if (string[sindex])
1927
      if (string[sindex])
1808
	sindex++;
1928
	{
1929
	  DECLARE_MBSTATE;
1930
	  if (!slen)
1931
	    slen = strlen (string);
1932
	  ADVANCE_CHAR (string, slen, sindex);
1933
	}
1809
1934
1810
      /* Now skip sequences of space, tab, or newline characters if they are
1935
      /* Now skip sequences of space, tab, or newline characters if they are
1811
	 in the list of separators. */
1936
	 in the list of separators. */
Lines 6796-6802 Link Here
6796
      ifs_cmap[uc] = 1;
6921
      ifs_cmap[uc] = 1;
6797
    }
6922
    }
6798
6923
6924
#if defined (HANDLE_MULTIBYTE)
6925
  if (!ifs_value)
6926
    {
6927
      ifs_firstc[0] = '\0';
6928
      ifs_firstc_len = 1;
6929
    }
6930
  else
6931
    {
6932
      size_t ifs_len = strnlen (ifs_value, MB_CUR_MAX);
6933
      ifs_firstc_len = mblen (ifs_value, ifs_len);
6934
      memcpy (ifs_firstc, ifs_value, ifs_firstc_len);
6935
    }
6936
#else
6799
  ifs_firstc = ifs_value ? *ifs_value : 0;
6937
  ifs_firstc = ifs_value ? *ifs_value : 0;
6938
#endif
6800
}
6939
}
6801
6940
6802
char *
6941
char *
(-)bash-3.0/subst.h.multibyteifs (+5 lines)
Lines 231-237 Link Here
231
extern SHELL_VAR *ifs_var;
231
extern SHELL_VAR *ifs_var;
232
extern char *ifs_value;
232
extern char *ifs_value;
233
extern unsigned char ifs_cmap[];
233
extern unsigned char ifs_cmap[];
234
#if defined (HANDLE_MULTIBYTE)
235
extern unsigned char ifs_firstc[];
236
extern size_t ifs_firstc_len;
237
#else
234
extern unsigned char ifs_firstc;
238
extern unsigned char ifs_firstc;
239
#endif
235
240
236
/* Evaluates to 1 if C is a character in $IFS. */
241
/* Evaluates to 1 if C is a character in $IFS. */
237
#define isifs(c)	(ifs_cmap[(unsigned char)(c)] != 0)
242
#define isifs(c)	(ifs_cmap[(unsigned char)(c)] != 0)

Return to bug 69407