|
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 * |