comparison src/core/ngx_string.c @ 6974:289403abc84e

Core: improved JSON escaping. Two-character representations are now used for \b, \f, \n, \r, and \t.
author Valentin Bartenev <vbart@nginx.com>
date Wed, 12 Apr 2017 22:47:57 +0300
parents b3682580c1bd
children e3723f2a11b7
comparison
equal deleted inserted replaced
6973:99934aade555 6974:289403abc84e
1806 1806
1807 if (ch == '\\' || ch == '"') { 1807 if (ch == '\\' || ch == '"') {
1808 len++; 1808 len++;
1809 1809
1810 } else if (ch <= 0x1f) { 1810 } else if (ch <= 0x1f) {
1811 len += sizeof("\\u001F") - 2; 1811
1812 switch (ch) {
1813 case '\n':
1814 case '\r':
1815 case '\t':
1816 case '\b':
1817 case '\f':
1818 len++;
1819 break;
1820
1821 default:
1822 len += sizeof("\\u001F") - 2;
1823 }
1812 } 1824 }
1813 1825
1814 size--; 1826 size--;
1815 } 1827 }
1816 1828
1827 } 1839 }
1828 1840
1829 *dst++ = ch; 1841 *dst++ = ch;
1830 1842
1831 } else { 1843 } else {
1832 *dst++ = '\\'; *dst++ = 'u'; *dst++ = '0'; *dst++ = '0'; 1844 *dst++ = '\\';
1833 *dst++ = '0' + (ch >> 4); 1845
1834 1846 switch (ch) {
1835 ch &= 0xf; 1847 case '\n':
1836 1848 *dst++ = 'n';
1837 *dst++ = (ch < 10) ? ('0' + ch) : ('A' + ch - 10); 1849 break;
1850
1851 case '\r':
1852 *dst++ = 'r';
1853 break;
1854
1855 case '\t':
1856 *dst++ = 't';
1857 break;
1858
1859 case '\b':
1860 *dst++ = 'b';
1861 break;
1862
1863 case '\f':
1864 *dst++ = 'f';
1865 break;
1866
1867 default:
1868 *dst++ = 'u'; *dst++ = '0'; *dst++ = '0';
1869 *dst++ = '0' + (ch >> 4);
1870
1871 ch &= 0xf;
1872
1873 *dst++ = (ch < 10) ? ('0' + ch) : ('A' + ch - 10);
1874 }
1838 } 1875 }
1839 1876
1840 size--; 1877 size--;
1841 } 1878 }
1842 1879