Author: markt
Date: Tue Jan 16 20:01:04 2018
New Revision: 1821297
URL: http://svn.apache.org/viewvc?rev=1821297&view=rev
Log:
Clean-up prior to fixing BZ 61993
Added:
tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java
- copied, changed from r1821197,
tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java
Modified:
tomcat/tc8.5.x/trunk/ (props changed)
tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java
tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java
tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java
Propchange: tomcat/tc8.5.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jan 16 20:01:04 2018
@@ -1,2 +1,2 @@
/tomcat/tc8.0.x/trunk:1809644
-/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737903,1737959,1738005,1738007,1738014-1738015,1738018,1738022,1738039,1738043,1738059-1738060,1738147,1738149,1738174-1738175,1738261,1738589,1738623-1738625,1738643,1738816,1738850,1738855,1738946-1738948,1738953-1738954,1738979,1738982,1739079-1739081,1739087,1739113,1739153,1739172,1739176,1739191,1739474,1739492,1739726,1739762,1739775,1739814,1739817-1739818,1739975,1740131,1740324,1740465,1740495,1740508-1740509,1740520,1740535,1740707,1740803,1740810,1740969,1740980,1740991,1740997,1741015,1741033,1741036,1741058,1741060,1741080,1741147,1741159,1741164,1741173,1741181,1741190,1741197,1741202,1741208,1741213,1741221,1741225,1741232,1741409
,1741501,1741677,1741892,1741896,1741984,1742023,1742042,1742071,1742090,1742093,1742101,1742105,1742111,1742139,1742146,1742148,1742166,1742181,1742184,1742187,1742246,1742248-1742251,1742263-1742264,1742268,1742276,1742369,1742387,1742448,1742509-1742512,1742917,1742919,1742933,1742975-1742976,1742984,1742986,1743019,1743115,1743117,1743124-1743125,1743134,1743425,1743554,1743679,1743696-1743698,1743700-1743701,1744058,1744064-1744065,1744125,1744149,1744194,1744229,1744270,1744323,1744432,1744684,1744697,1744705,1744713,1744760,1744786,1745083,1745142-1745143,1745145,1745177,1745179-1745180,1745227,1745248,1745254,1745337,1745467,1745473,1745535,1745576,1745735,1745744,1746304,1746306-1746307,1746319,1746327,1746338,1746340-1746341,1746344,1746427,1746441,1746473,1746490,1746492,1746495-1746496,1746499-1746501,1746503-1746507,1746509,1746549,1746551,1746554,1746556,1746558,1746584,1746620,1746649,1746724,1746939,1746989,1747014,1747028,1747035,1747210,1747225,1747234,1747253,1747
404,1747506,1747536,1747924,1747980,1747993,1748001,1748253,1748452,1748547,1748629,1748676,1748715,1749287,1749296,1749328,1749373,1749465,1749506,1749508,1749665-1749666,1749763,1749865-1749866,1749898,1749978,1749980,1750011,1750015,1750056,1750480,1750617,1750634,1750692,1750697,1750700,1750703,1750707,1750714,1750718,1750723,1750774,1750899,1750975,1750995,1751061,1751097,1751173,1751438,1751447,1751463,1751702,1752212,1752737,1752745,1753078,1753080,1753358,1753363,1754111,1754140-1754141,1754281,1754310,1754445,1754467,1754494,1754496,1754528,1754532-1754533,1754613,1754714,1754874,1754941,1754944,1754950-1754951,1755005,1755007,1755009,1755132,1755180-1755181,1755185,1755190,1755204-1755206,1755208,1755214,1755224,1755227,1755230,1755629,1755646-1755647,1755650,1755653,1755675,1755680,1755683,1755693,1755717,1755731-1755737,1755812,1755828,1755884,1755890,1755918-1755919,1755942,1755958,1755960,1755970,1755993,1756013,1756019,1756039,1756056,1756083-1756114,1756175,1756288-1
756289,1756408-1756410,1756778,1756798,1756878,1756898,1756939,1757123-1757124,1757126,1757128,1757132-1757133,1757136,1757145,1757167-1757168,1757175,1757180,1757182,1757195,1757271,1757278,1757347,1757353-1757354,1757363,1757374,1757399,1757406,1757408,1757485,1757495,1757499,1757527,1757578,1757684,1757722,1757727,1757790,1757799,1757813,1757853,1757883,1757903,1757976,1757997,1758000,1758058,1758072-1758075,1758078-1758079,1758223,1758257,1758261,1758276,1758292,1758369,1758378-1758383,1758421,1758423,1758425-1758427,1758430,1758443,1758448,1758459,1758483,1758486-1758487,1758499,1758525,1758556,1758580,1758582,1758584,1758588,1758842,1759019,1759212,1759224,1759227,1759252,1759274,1759513-1759516,1759611,1759757,1759785-1759790,1760005,1760022,1760109-1760110,1760135,1760200-1760201,1760227,1760300,1760397,1760446,1760454,1760640,1760648,1761057,1761422,1761491,1761498,1761500-1761501,1761550,1761553,1761572,1761574,1761625-1761626,1761628,1761682,1761740,1761752,1762051-176205
3,1762123,1762168,1762172,1762182,1762201-1762202,1762204,1762208,1762288,1762296,1762324,1762348,1762353,1762362,1762374,1762492,1762503,1762505,1762541,1762608,1762710,1762753,1762766,1762769,1762944,1762947,1762953,1763167,1763179,1763232,1763259,1763271-1763272,1763276-1763277,1763319-1763320,1763370,1763372,1763375,1763377,1763393,1763412,1763430,1763450,1763462,1763505,1763511-1763512,1763516,1763518,1763520,1763529,1763559,1763565,1763568,1763574,1763619,1763634-1763635,1763718,1763748,1763786,1763798-1763799,1763810,1763813,1763815,1763819,1763831,1764083,1764425,1764646,1764648-1764649,1764659,1764663,1764682,1764862,1764866-1764867,1764870,1764897,1765133,1765299,1765358,1765439,1765447,1765495,1765502,1765569-1765571,1765579,1765582,1765589-1765590,1765794,1765801,1765813,1765815,1766276,1766514,1766533,1766535,1766664,1766675,1766698,1766700,1766822,1766834,1766840,1767047,1767328,1767362,1767368,1767429,1767471,1767505,1767641-1767644,1767903,1767945-1767946,1768123,176
8283,1768520,1768569,1768651,1768762,1768922,1769191,1769263,1769630,1769833,1769975,1770047,1770140,1770180,1770258,1770389,1770656,1770666,1770718,1770762,1770952,1770954,1770956,1770961,1771087,1771126,1771139,1771143,1771149,1771156,1771266,1771316,1771386,1771611,1771613,1771711,1771718,1771723-1771724,1771730,1771743,1771752,1771853,1771963,1772170,1772174,1772223,1772229,1772318-1772319,1772353,1772355,1772554,1772603-1772609,1772849,1772865,1772870,1772872,1772875-1772876,1772881,1772886,1772947,1773306,1773344,1773418,1773756,1773813-1773814,1774052,1774102,1774131,1774161,1774164,1774248,1774253,1774257,1774259,1774262,1774267,1774271,1774303,1774340,1774406,1774412,1774426,1774433,1774522-1774523,1774526,1774528-1774529,1774531,1774732-1774736,1774738-1774739,1774741-1774742,1774749,1774755,1774789,1774858,1774867,1775596,1775985-1775986,1776540,1776937,1776954,1777011,1777173,1777189,1777211,1777524,1777546,1777605,1777619,1777647,1777721-1777722,1777967,1778061,1778138-
1778139,1778141-1778150,1778154,1778275-1778276,1778295,1778342,1778348,1778404,1778424,1778426,1778575,1778582,1778600,1778603,1779312,1779370,1779545,1779612,1779622,1779641,1779654,1779708,1779718,1779897,1779899,1779932,1780109,1780120,1780189,1780196,1780488,1780514-1780516,1780601,1780606,1780609-1780610,1780652,1780991,1780995-1780996,1781174,1781569,1781975,1781986,1782116,1782383-1782384,1782566,1782572,1782775,1782779,1782814,1782857,1782868,1782934,1782946-1782947,1782956,1783144-1783147,1783155,1783408,1784182,1784565,1784583,1784657,1784669,1784712,1784723,1784751,1784767,1784806,1784818,1784911,1784926,1784956,1784963,1785032,1785037,1785245,1785271,1785310,1785317,1785643,1785667,1785762,1785774,1785823,1785935,1786051,1786070,1786123-1786124,1786127,1786129,1786341,1786378,1786844,1787200,1787250,1787405,1787701,1787703,1787938,1787959,1787973,1788223-1788224,1788228,1788232,1788241-1788242,1788248,1788323,1788328,1788455,1788460,1788473,1788543-1788544,1788548,17885
50,1788554,1788558,1788560,1788567,1788569,1788572,1788647,1788732,1788741,1788747,1788753,1788764,1788771,1788834,1788841,1788852,1788860,1788883,1788890,1789051,1789400,1789415,1789442-1789443,1789447,1789453,1789456,1789458,1789461-1789463,1789465-1789467,1789470,1789472,1789474,1789476,1789479-1789480,1789733,1789735,1789744-1789745,1789937,1789984,1790119,1790180,1790183,1790213,1790376,1790443,1790614,1790983,1790991,1791027-1791028,1791050,1791090,1791095-1791096,1791099,1791101-1791103,1791124,1791129,1791134,1791137,1791298,1791527,1791557,1791970,1792033,1792038,1792055,1792093,1792140,1792460,1792468,1792791,1792957,1793095,1793121,1793123,1793127,1793136,1793139,1793147-1793148,1793266,1793437,1793449,1793460,1793468,1793487,1793498,1793502,1793514,1793682-1793683,1793711-1793712,1793716,1793719,1793736,1793746,1793758,1793771,1793776,1793798,1793802,1793812,1793819,1793844,1793854,1793887,1793891,1793898,1793901-1793902,1793907,1793910,1793980,1794674,1794941-1794942,17
95278,1795289,1795298,1795305,1795813,1795893,1796090,1796275,1796693-1796695,1796729,1796806,1796836,1796873,1796878,1797197,1797338,1797344,1797354-1797355,1797516,1797528,1797532,1797536,1797540,1797543,1797677-1797678,1797692,1797694,1797748,1797828,1798126,1798238,1798280,1798371,1798379,1798384,1798390,1798395,1798419,1798505,1798507,1798509,1798533,1798546,1798561,1798977,1799115,1799126,1799164,1799190,1799194,1799216,1799231,1799250,1799253,1799285,1799368,1799412,1799515,1799701-1799702,1799704,1799709,1799885,1799893,1799895,1799916,1800136-1800138,1800202,1800309,1800390,1800617,1800629,1800791,1800816,1800850,1800864,1800867,1800874,1800885,1800981,1800984,1800988,1800992,1801195,1801686,1801688,1801709,1801717,1801774,1801778,1802083,1802195,1802204-1802205,1802210,1802225-1802226,1802229,1802403,1802475,1802490,1802788,1802796,1802803,1802820,1802828,1802833,1802836,1803030,1803038,1803055,1803135,1803165,1803174,1803193,1803205,1803224,1803278,1803281,1803295,1803297
,1803446,1803451,1803456,1803459,1803616,1803636,1803828,1803901,1803972,1804040,1804094,1804306,1804461-1804463,1804501,1804506-1804507,1804754,1804813,1804888,1804890,1804903-1804908,1804915,1804917,1805523-1805530,1805550,1805612-1805613,1805637,1805645,1805652,1805726,1805752,1805782,1805826,1806307,1806356,1806445,1806736,1806794,1806798,1806801,1806807,1806873,1806966,1806973,1807004,1807093,1807135,1807205-1807206,1807237,1807242,1807251,1807282,1807455,1807686,1807698,1807713,1807715,1807729,1807742,1807747,1807751,1807755,1808116,1808156,1808266,1808433,1808438-1808439,1808466,1808481-1808482,1808695,1808701,1808766,1809011,1809025,1809141,1809143-1809144,1809146,1809158,1809212,1809214,1809239,1809248,1809263,1809265,1809317,1809434,1809669,1809671,1809674,1809684,1809711,1809828,1809830,1809908-1809909,1809922,1810106,1810110,1810280,1810300,1811031,1811119,1811122,1811132,1811137,1811139,1811174,1811176,1811198-1811201,1811203-1811206,1811220,1811235,1811246,1811327-1811
329,1811350,1811560,1811704,1811837-1811839,1811861,1811932,1812087-1812088,1812092,1812094,1812103,1812107,1812113,1812129,1812134-1812136,1812184,1812315,1812401,1812489,1812513,1812617,1813919,1814192,1814195,1814567,1814825,1814973,1814980,1815066,1815069,1815208,1815215,1815318-1815319,1815325,1815385,1815429,1815441-1815442,1815451,1815459,1815465,1815505,1815615,1815793,1815800,1815802,1815806,1815826,1815829,1815834,1815840,1815903,1815944,1815954,1816076,1816078,1816083,1816087,1816120,1816128,1816140,1816147,1816157,1816338,1816431,1816443,1816538,1816541,1816545,1816549-1816550,1816563,1816570,1816647,1816695-1816704,1816716,1816780,1816887,1817089,1817092,1817096,1817104,1817126,1817136-1817137,1817196,1817223,1817298,1817305,1817495,1817517,1817520,1817965,1817997,1817999-1818001,1818004,1818179,1818184,1818438,1818711,1818919,1818976,1819054,1819057,1819061,1819063,1819068,1819070-1819071,1819074,1819077,1819148,1819903,1820003,1820005,1820138,1820153,1820194,1820196-1
820197,1820202,1820206,1820222,1820265,1820272,1820276,1820279,1820281,1820302,1820634,1820701,1820705,1821157,1821167
+/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737903,1737959,1738005,1738007,1738014-1738015,1738018,1738022,1738039,1738043,1738059-1738060,1738147,1738149,1738174-1738175,1738261,1738589,1738623-1738625,1738643,1738816,1738850,1738855,1738946-1738948,1738953-1738954,1738979,1738982,1739079-1739081,1739087,1739113,1739153,1739172,1739176,1739191,1739474,1739492,1739726,1739762,1739775,1739814,1739817-1739818,1739975,1740131,1740324,1740465,1740495,1740508-1740509,1740520,1740535,1740707,1740803,1740810,1740969,1740980,1740991,1740997,1741015,1741033,1741036,1741058,1741060,1741080,1741147,1741159,1741164,1741173,1741181,1741190,1741197,1741202,1741208,1741213,1741221,1741225,1741232,1741409
,1741501,1741677,1741892,1741896,1741984,1742023,1742042,1742071,1742090,1742093,1742101,1742105,1742111,1742139,1742146,1742148,1742166,1742181,1742184,1742187,1742246,1742248-1742251,1742263-1742264,1742268,1742276,1742369,1742387,1742448,1742509-1742512,1742917,1742919,1742933,1742975-1742976,1742984,1742986,1743019,1743115,1743117,1743124-1743125,1743134,1743425,1743554,1743679,1743696-1743698,1743700-1743701,1744058,1744064-1744065,1744125,1744149,1744194,1744229,1744270,1744323,1744432,1744684,1744697,1744705,1744713,1744760,1744786,1745083,1745142-1745143,1745145,1745177,1745179-1745180,1745227,1745248,1745254,1745337,1745467,1745473,1745535,1745576,1745735,1745744,1746304,1746306-1746307,1746319,1746327,1746338,1746340-1746341,1746344,1746427,1746441,1746473,1746490,1746492,1746495-1746496,1746499-1746501,1746503-1746507,1746509,1746549,1746551,1746554,1746556,1746558,1746584,1746620,1746649,1746724,1746939,1746989,1747014,1747028,1747035,1747210,1747225,1747234,1747253,1747
404,1747506,1747536,1747924,1747980,1747993,1748001,1748253,1748452,1748547,1748629,1748676,1748715,1749287,1749296,1749328,1749373,1749465,1749506,1749508,1749665-1749666,1749763,1749865-1749866,1749898,1749978,1749980,1750011,1750015,1750056,1750480,1750617,1750634,1750692,1750697,1750700,1750703,1750707,1750714,1750718,1750723,1750774,1750899,1750975,1750995,1751061,1751097,1751173,1751438,1751447,1751463,1751702,1752212,1752737,1752745,1753078,1753080,1753358,1753363,1754111,1754140-1754141,1754281,1754310,1754445,1754467,1754494,1754496,1754528,1754532-1754533,1754613,1754714,1754874,1754941,1754944,1754950-1754951,1755005,1755007,1755009,1755132,1755180-1755181,1755185,1755190,1755204-1755206,1755208,1755214,1755224,1755227,1755230,1755629,1755646-1755647,1755650,1755653,1755675,1755680,1755683,1755693,1755717,1755731-1755737,1755812,1755828,1755884,1755890,1755918-1755919,1755942,1755958,1755960,1755970,1755993,1756013,1756019,1756039,1756056,1756083-1756114,1756175,1756288-1
756289,1756408-1756410,1756778,1756798,1756878,1756898,1756939,1757123-1757124,1757126,1757128,1757132-1757133,1757136,1757145,1757167-1757168,1757175,1757180,1757182,1757195,1757271,1757278,1757347,1757353-1757354,1757363,1757374,1757399,1757406,1757408,1757485,1757495,1757499,1757527,1757578,1757684,1757722,1757727,1757790,1757799,1757813,1757853,1757883,1757903,1757976,1757997,1758000,1758058,1758072-1758075,1758078-1758079,1758223,1758257,1758261,1758276,1758292,1758369,1758378-1758383,1758421,1758423,1758425-1758427,1758430,1758443,1758448,1758459,1758483,1758486-1758487,1758499,1758525,1758556,1758580,1758582,1758584,1758588,1758842,1759019,1759212,1759224,1759227,1759252,1759274,1759513-1759516,1759611,1759757,1759785-1759790,1760005,1760022,1760109-1760110,1760135,1760200-1760201,1760227,1760300,1760397,1760446,1760454,1760640,1760648,1761057,1761422,1761491,1761498,1761500-1761501,1761550,1761553,1761572,1761574,1761625-1761626,1761628,1761682,1761740,1761752,1762051-176205
3,1762123,1762168,1762172,1762182,1762201-1762202,1762204,1762208,1762288,1762296,1762324,1762348,1762353,1762362,1762374,1762492,1762503,1762505,1762541,1762608,1762710,1762753,1762766,1762769,1762944,1762947,1762953,1763167,1763179,1763232,1763259,1763271-1763272,1763276-1763277,1763319-1763320,1763370,1763372,1763375,1763377,1763393,1763412,1763430,1763450,1763462,1763505,1763511-1763512,1763516,1763518,1763520,1763529,1763559,1763565,1763568,1763574,1763619,1763634-1763635,1763718,1763748,1763786,1763798-1763799,1763810,1763813,1763815,1763819,1763831,1764083,1764425,1764646,1764648-1764649,1764659,1764663,1764682,1764862,1764866-1764867,1764870,1764897,1765133,1765299,1765358,1765439,1765447,1765495,1765502,1765569-1765571,1765579,1765582,1765589-1765590,1765794,1765801,1765813,1765815,1766276,1766514,1766533,1766535,1766664,1766675,1766698,1766700,1766822,1766834,1766840,1767047,1767328,1767362,1767368,1767429,1767471,1767505,1767641-1767644,1767903,1767945-1767946,1768123,176
8283,1768520,1768569,1768651,1768762,1768922,1769191,1769263,1769630,1769833,1769975,1770047,1770140,1770180,1770258,1770389,1770656,1770666,1770718,1770762,1770952,1770954,1770956,1770961,1771087,1771126,1771139,1771143,1771149,1771156,1771266,1771316,1771386,1771611,1771613,1771711,1771718,1771723-1771724,1771730,1771743,1771752,1771853,1771963,1772170,1772174,1772223,1772229,1772318-1772319,1772353,1772355,1772554,1772603-1772609,1772849,1772865,1772870,1772872,1772875-1772876,1772881,1772886,1772947,1773306,1773344,1773418,1773756,1773813-1773814,1774052,1774102,1774131,1774161,1774164,1774248,1774253,1774257,1774259,1774262,1774267,1774271,1774303,1774340,1774406,1774412,1774426,1774433,1774522-1774523,1774526,1774528-1774529,1774531,1774732-1774736,1774738-1774739,1774741-1774742,1774749,1774755,1774789,1774858,1774867,1775596,1775985-1775986,1776540,1776937,1776954,1777011,1777173,1777189,1777211,1777524,1777546,1777605,1777619,1777647,1777721-1777722,1777967,1778061,1778138-
1778139,1778141-1778150,1778154,1778275-1778276,1778295,1778342,1778348,1778404,1778424,1778426,1778575,1778582,1778600,1778603,1779312,1779370,1779545,1779612,1779622,1779641,1779654,1779708,1779718,1779897,1779899,1779932,1780109,1780120,1780189,1780196,1780488,1780514-1780516,1780601,1780606,1780609-1780610,1780652,1780991,1780995-1780996,1781174,1781569,1781975,1781986,1782116,1782383-1782384,1782566,1782572,1782775,1782779,1782814,1782857,1782868,1782934,1782946-1782947,1782956,1783144-1783147,1783155,1783408,1784182,1784565,1784583,1784657,1784669,1784712,1784723,1784751,1784767,1784806,1784818,1784911,1784926,1784956,1784963,1785032,1785037,1785245,1785271,1785310,1785317,1785643,1785667,1785762,1785774,1785823,1785935,1786051,1786070,1786123-1786124,1786127,1786129,1786341,1786378,1786844,1787200,1787250,1787405,1787701,1787703,1787938,1787959,1787973,1788223-1788224,1788228,1788232,1788241-1788242,1788248,1788323,1788328,1788455,1788460,1788473,1788543-1788544,1788548,17885
50,1788554,1788558,1788560,1788567,1788569,1788572,1788647,1788732,1788741,1788747,1788753,1788764,1788771,1788834,1788841,1788852,1788860,1788883,1788890,1789051,1789400,1789415,1789442-1789443,1789447,1789453,1789456,1789458,1789461-1789463,1789465-1789467,1789470,1789472,1789474,1789476,1789479-1789480,1789733,1789735,1789744-1789745,1789937,1789984,1790119,1790180,1790183,1790213,1790376,1790443,1790614,1790983,1790991,1791027-1791028,1791050,1791090,1791095-1791096,1791099,1791101-1791103,1791124,1791129,1791134,1791137,1791298,1791527,1791557,1791970,1792033,1792038,1792055,1792093,1792140,1792460,1792468,1792791,1792957,1793095,1793121,1793123,1793127,1793136,1793139,1793147-1793148,1793266,1793437,1793449,1793460,1793468,1793487,1793498,1793502,1793514,1793682-1793683,1793711-1793712,1793716,1793719,1793736,1793746,1793758,1793771,1793776,1793798,1793802,1793812,1793819,1793844,1793854,1793887,1793891,1793898,1793901-1793902,1793907,1793910,1793980,1794674,1794941-1794942,17
95278,1795289,1795298,1795305,1795813,1795893,1796090,1796275,1796693-1796695,1796729,1796806,1796836,1796873,1796878,1797197,1797338,1797344,1797354-1797355,1797516,1797528,1797532,1797536,1797540,1797543,1797677-1797678,1797692,1797694,1797748,1797828,1798126,1798238,1798280,1798371,1798379,1798384,1798390,1798395,1798419,1798505,1798507,1798509,1798533,1798546,1798561,1798977,1799115,1799126,1799164,1799190,1799194,1799216,1799231,1799250,1799253,1799285,1799368,1799412,1799515,1799701-1799702,1799704,1799709,1799885,1799893,1799895,1799916,1800136-1800138,1800202,1800309,1800390,1800617,1800629,1800791,1800816,1800850,1800864,1800867,1800874,1800885,1800981,1800984,1800988,1800992,1801195,1801686,1801688,1801709,1801717,1801774,1801778,1802083,1802195,1802204-1802205,1802210,1802225-1802226,1802229,1802403,1802475,1802490,1802788,1802796,1802803,1802820,1802828,1802833,1802836,1803030,1803038,1803055,1803135,1803165,1803174,1803193,1803205,1803224,1803278,1803281,1803295,1803297
,1803446,1803451,1803456,1803459,1803616,1803636,1803828,1803901,1803972,1804040,1804094,1804306,1804461-1804463,1804501,1804506-1804507,1804754,1804813,1804888,1804890,1804903-1804908,1804915,1804917,1805523-1805530,1805550,1805612-1805613,1805637,1805645,1805652,1805726,1805752,1805782,1805826,1806307,1806356,1806445,1806736,1806794,1806798,1806801,1806807,1806873,1806966,1806973,1807004,1807093,1807135,1807205-1807206,1807237,1807242,1807251,1807282,1807455,1807686,1807698,1807713,1807715,1807729,1807742,1807747,1807751,1807755,1808116,1808156,1808266,1808433,1808438-1808439,1808466,1808481-1808482,1808695,1808701,1808766,1809011,1809025,1809141,1809143-1809144,1809146,1809158,1809212,1809214,1809239,1809248,1809263,1809265,1809317,1809434,1809669,1809671,1809674,1809684,1809711,1809828,1809830,1809908-1809909,1809922,1810106,1810110,1810280,1810300,1811031,1811119,1811122,1811132,1811137,1811139,1811174,1811176,1811198-1811201,1811203-1811206,1811220,1811235,1811246,1811327-1811
329,1811350,1811560,1811704,1811837-1811839,1811861,1811932,1812087-1812088,1812092,1812094,1812103,1812107,1812113,1812129,1812134-1812136,1812184,1812315,1812401,1812489,1812513,1812617,1813919,1814192,1814195,1814567,1814825,1814973,1814980,1815066,1815069,1815208,1815215,1815318-1815319,1815325,1815385,1815429,1815441-1815442,1815451,1815459,1815465,1815505,1815615,1815793,1815800,1815802,1815806,1815826,1815829,1815834,1815840,1815903,1815944,1815954,1816076,1816078,1816083,1816087,1816120,1816128,1816140,1816147,1816157,1816338,1816431,1816443,1816538,1816541,1816545,1816549-1816550,1816563,1816570,1816647,1816695-1816704,1816716,1816780,1816887,1817089,1817092,1817096,1817104,1817126,1817136-1817137,1817196,1817223,1817298,1817305,1817495,1817517,1817520,1817965,1817997,1817999-1818001,1818004,1818179,1818184,1818438,1818711,1818919,1818976,1819054,1819057,1819061,1819063,1819068,1819070-1819071,1819074,1819077,1819148,1819903,1820003,1820005,1820138,1820153,1820194,1820196-1
820197,1820202,1820206,1820222,1820265,1820272,1820276,1820279,1820281,1820302,1820634,1820701,1820705,1820981,1820994,1821157,1821167,1821197-1821203,1821225,1821234-1821235,1821251-1821252
Copied: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java
(from r1821197, tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java)
URL:
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java&p1=tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java&r1=1821197&r2=1821297&rev=1821297&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java (original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java Tue
Jan 16 20:01:04 2018
@@ -25,4 +25,121 @@ public abstract class AbstractChunk impl
private static final long serialVersionUID = 1L;
+
+ private int hashCode = 0;
+ protected boolean hasHashCode = false;
+
+ protected boolean isSet;
+
+ protected int start;
+ protected int end;
+
+
+ /**
+ * @return the start position of the data in the buffer
+ */
+ public int getStart() {
+ return start;
+ }
+
+
+ public int getEnd() {
+ return end;
+ }
+
+
+ public void setEnd(int i) {
+ end = i;
+ }
+
+
+ // TODO: Deprecate offset and use start
+
+ public int getOffset() {
+ return start;
+ }
+
+
+ public void setOffset(int off) {
+ if (end < off) {
+ end = off;
+ }
+ start = off;
+ }
+
+
+ /**
+ * @return the length of the data in the buffer
+ */
+ public int getLength() {
+ return end - start;
+ }
+
+
+ public boolean isNull() {
+ if (end > 0) {
+ return false;
+ }
+ return !isSet;
+ }
+
+
+ public int indexOf(String src, int srcOff, int srcLen, int myOff) {
+ char first = src.charAt(srcOff);
+
+ // Look for first char
+ int srcEnd = srcOff + srcLen;
+
+ mainLoop: for (int i = myOff + start; i <= (end - srcLen); i++) {
+ if (getBufferElement(i) != first) {
+ continue;
+ }
+ // found first char, now look for a match
+ int myPos = i + 1;
+ for (int srcPos = srcOff + 1; srcPos < srcEnd;) {
+ if (getBufferElement(myPos++) != src.charAt(srcPos++)) {
+ continue mainLoop;
+ }
+ }
+ return i - start; // found it
+ }
+ return -1;
+ }
+
+
+ /**
+ * Resets the chunk to an uninitialized state.
+ */
+ public void recycle() {
+ hasHashCode = false;
+ isSet = false;
+ start = 0;
+ end = 0;
+ }
+
+
+ @Override
+ public int hashCode() {
+ if (hasHashCode) {
+ return hashCode;
+ }
+ int code = 0;
+
+ code = hash();
+ hashCode = code;
+ hasHashCode = true;
+ return code;
+ }
+
+
+ public int hash() {
+ int code = 0;
+ for (int i = start; i < end; i++) {
+ code = code * 37 + getBufferElement(i);
+ }
+ return code;
+ }
+
+
+ protected abstract int getBufferElement(int index);
}
Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java?rev=1821297&r1=1821296&r2=1821297&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java
(original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java Tue Jan
16 20:01:04 2018
@@ -17,7 +17,6 @@
package org.apache.tomcat.util.buf;
import java.io.IOException;
-import java.io.Serializable;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
@@ -41,16 +40,15 @@ import java.nio.charset.StandardCharsets
// inside this way it could provide the search/etc on ByteBuffer, as a helper.
/**
- * This class is used to represent a chunk of bytes, and
- * utilities to manipulate byte[].
+ * This class is used to represent a chunk of bytes, and utilities to
manipulate
+ * byte[].
*
* The buffer can be modified and used for both input and output.
*
* There are 2 modes: The chunk can be associated with a sink -
ByteInputChannel
* or ByteOutputChannel, which will be used when the buffer is empty (on input)
- * or filled (on output).
- * For output, it can also grow. This operating mode is selected by calling
- * setLimit() or allocate(initial, limit) with limit != -1.
+ * or filled (on output). For output, it can also grow. This operating mode is
+ * selected by calling setLimit() or allocate(initial, limit) with limit != -1.
*
* Various search and append method are defined - similar with String and
* StringBuffer, but operating on bytes.
@@ -65,43 +63,50 @@ import java.nio.charset.StandardCharsets
* @author Costin Manolache
* @author Remy Maucherat
*/
-public final class ByteChunk implements Cloneable, Serializable {
+public final class ByteChunk extends AbstractChunk {
private static final long serialVersionUID = 1L;
- /** Input interface, used when the buffer is empty
+ /**
+ * Input interface, used when the buffer is empty.
*
- * Same as java.nio.channel.ReadableByteChannel
+ * Same as java.nio.channels.ReadableByteChannel
*/
public static interface ByteInputChannel {
+
/**
* Read new bytes.
*
* @return The number of bytes read
*
- * @throws IOException If an I/O occurs while reading the bytes
+ * @throws IOException If an I/O error occurs during reading
*/
public int realReadBytes() throws IOException;
}
- /** Same as java.nio.channel.WritableByteChannel.
+ /**
+ * When we need more space we'll either grow the buffer ( up to the limit )
+ * or send it to a channel.
+ *
+ * Same as java.nio.channel.WritableByteChannel.
*/
public static interface ByteOutputChannel {
+
/**
- * Send the bytes ( usually the internal conversion buffer ).
- * Expect 8k output if the buffer is full.
+ * Send the bytes ( usually the internal conversion buffer ). Expect 8k
+ * output if the buffer is full.
*
- * @param cbuf bytes that will be written
+ * @param buf bytes that will be written
* @param off offset in the bytes array
* @param len length that will be written
* @throws IOException If an I/O occurs while writing the bytes
*/
- public void realWriteBytes(byte cbuf[], int off, int len)
- throws IOException;
+ public void realWriteBytes(byte buf[], int off, int len) throws
IOException;
+
/**
- * Send the bytes ( usually the internal conversion buffer ).
- * Expect 8k output if the buffer is full.
+ * Send the bytes ( usually the internal conversion buffer ). Expect 8k
+ * output if the buffer is full.
*
* @param from bytes that will be written
* @throws IOException If an I/O occurs while writing the bytes
@@ -111,41 +116,35 @@ public final class ByteChunk implements
// --------------------
- /** Default encoding used to convert to strings. It should be UTF8,
- as most standards seem to converge, but the servlet API requires
- 8859_1, and this object is used mostly for servlets.
- */
+ /**
+ * Default encoding used to convert to strings. It should be UTF8, as most
+ * standards seem to converge, but the servlet API requires 8859_1, and
this
+ * object is used mostly for servlets.
+ */
public static final Charset DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;
- private int hashCode=0;
- // did we compute the hashcode ?
- private boolean hasHashCode = false;
+ private transient Charset charset;
// byte[]
private byte[] buff;
- private int start=0;
- private int end;
-
- private Charset charset;
-
- private boolean isSet=false; // XXX
-
- // How much can it grow, when data is added
- private int limit=-1;
+ // -1: grow indefinitely
+ // maximum amount to be cached
+ private int limit = -1;
private ByteInputChannel in = null;
private ByteOutputChannel out = null;
+
/**
* Creates a new, uninitialized ByteChunk object.
*/
public ByteChunk() {
- // NO-OP
}
- public ByteChunk( int initial ) {
- allocate( initial, -1 );
+
+ public ByteChunk(int initial) {
+ allocate(initial, -1);
}
@Override
@@ -153,36 +152,30 @@ public final class ByteChunk implements
return super.clone();
}
- public boolean isNull() {
- return ! isSet; // buff==null;
- }
- /**
- * Resets the message buff to an uninitialized state.
- */
+ @Override
public void recycle() {
- charset=null;
- start=0;
- end=0;
- isSet=false;
- hasHashCode = false;
+ super.recycle();
+ charset = null;
}
+
// -------------------- Setup --------------------
- public void allocate( int initial, int limit ) {
- if( buff==null || buff.length < initial ) {
- buff=new byte[initial];
- }
- this.limit=limit;
- start=0;
- end=0;
- isSet=true;
+ public void allocate(int initial, int limit) {
+ if (buff == null || buff.length < initial) {
+ buff = new byte[initial];
+ }
+ this.limit = limit;
+ start = 0;
+ end = 0;
+ isSet = true;
hasHashCode = false;
}
+
/**
- * Sets the message bytes to the specified subarray of bytes.
+ * Sets the buffer to the specified subarray of bytes.
*
* @param b the ascii bytes
* @param off the start offset of the bytes
@@ -191,15 +184,17 @@ public final class ByteChunk implements
public void setBytes(byte[] b, int off, int len) {
buff = b;
start = off;
- end = start+ len;
- isSet=true;
+ end = start + len;
+ isSet = true;
hasHashCode = false;
}
+
public void setCharset(Charset charset) {
this.charset = charset;
}
+
public Charset getCharset() {
if (charset == null) {
charset = DEFAULT_CHARSET;
@@ -207,109 +202,84 @@ public final class ByteChunk implements
return charset;
}
+
/**
- * @return the message bytes.
+ * @return the buffer.
*/
public byte[] getBytes() {
return getBuffer();
}
+
/**
- * @return the message bytes.
+ * @return the buffer.
*/
public byte[] getBuffer() {
return buff;
}
- /**
- * @return the start offset of the bytes.
- * For output this is the end of the buffer.
- */
- public int getStart() {
- return start;
- }
-
- public int getOffset() {
- return start;
- }
-
- public void setOffset(int off) {
- if (end < off ) {
- end=off;
- }
- start=off;
- }
-
- /**
- * @return the length of the bytes.
- */
- public int getLength() {
- return end-start;
- }
/**
- * Maximum amount of data in this buffer.
- * If -1 or not set, the buffer will grow indefinitely.
- * Can be smaller than the current buffer size ( which will not shrink ).
- * When the limit is reached, the buffer will be flushed ( if out is set )
- * or throw exception.
+ * Maximum amount of data in this buffer. If -1 or not set, the buffer will
+ * grow indefinitely. Can be smaller than the current buffer size ( which
+ * will not shrink ). When the limit is reached, the buffer will be flushed
+ * ( if out is set ) or throw exception.
+ *
* @param limit The new limit
*/
public void setLimit(int limit) {
- this.limit=limit;
+ this.limit = limit;
}
+
public int getLimit() {
return limit;
}
+
/**
* When the buffer is empty, read the data from the input channel.
+ *
* @param in The input channel
*/
public void setByteInputChannel(ByteInputChannel in) {
this.in = in;
}
+
/**
- * When the buffer is full, write the data to the output channel.
- * Also used when large amount of data is appended.
- * If not set, the buffer will grow to the limit.
+ * When the buffer is full, write the data to the output channel. Also used
+ * when large amount of data is appended. If not set, the buffer will grow
+ * to the limit.
+ *
* @param out The output channel
*/
public void setByteOutputChannel(ByteOutputChannel out) {
- this.out=out;
+ this.out = out;
}
- public int getEnd() {
- return end;
- }
-
- public void setEnd( int i ) {
- end=i;
- }
// -------------------- Adding data to the buffer --------------------
- public void append( byte b )
- throws IOException
- {
- makeSpace( 1 );
+
+ public void append(byte b) throws IOException {
+ makeSpace(1);
// couldn't make space
- if( limit >0 && end >= limit ) {
+ if (limit > 0 && end >= limit) {
flushBuffer();
}
- buff[end++]=b;
+ buff[end++] = b;
}
- public void append( ByteChunk src )
- throws IOException
- {
- append( src.getBytes(), src.getStart(), src.getLength());
+
+ public void append(ByteChunk src) throws IOException {
+ append(src.getBytes(), src.getStart(), src.getLength());
}
+
/**
* Add data to the buffer.
+ *
* @param src Bytes array
* @param off Offset
* @param len Length
@@ -317,13 +287,13 @@ public final class ByteChunk implements
*/
public void append(byte src[], int off, int len) throws IOException {
// will grow, up to limit
- makeSpace( len );
+ makeSpace(len);
// if we don't have limit: makeSpace can grow as it wants
- if( limit < 0 ) {
+ if (limit < 0) {
// assert: makeSpace made enough space
- System.arraycopy( src, off, buff, end, len );
- end+=len;
+ System.arraycopy(src, off, buff, end, len);
+ end += len;
return;
}
@@ -331,16 +301,18 @@ public final class ByteChunk implements
// If the buffer is empty and the source is going to fill up all the
// space in buffer, may as well write it directly to the output,
// and avoid an extra copy
- if ( len == limit && end == start && out != null ) {
- out.realWriteBytes( src, off, len );
+ if (len == limit && end == start && out != null) {
+ out.realWriteBytes(src, off, len);
return;
}
+
// if we have limit and we're below
- if( len <= limit - end ) {
+ if (len <= limit - end) {
// makeSpace will grow the buffer to the limit,
// so we have space
- System.arraycopy( src, off, buff, end, len );
- end+=len;
+ System.arraycopy(src, off, buff, end, len);
+
+ end += len;
return;
}
@@ -352,7 +324,7 @@ public final class ByteChunk implements
// We chunk the data into slices fitting in the buffer limit, although
// if the data is written directly if it doesn't fit
- int avail=limit-end;
+ int avail = limit - end;
System.arraycopy(src, off, buff, end, avail);
end += avail;
@@ -361,7 +333,7 @@ public final class ByteChunk implements
int remain = len - avail;
while (remain > (limit - end)) {
- out.realWriteBytes( src, (off + len) - remain, limit - end );
+ out.realWriteBytes(src, (off + len) - remain, limit - end);
remain = remain - (limit - end);
}
@@ -457,7 +429,7 @@ public final class ByteChunk implements
}
- public int substract(byte dest[], int off, int len ) throws IOException {
+ public int substract(byte dest[], int off, int len) throws IOException {
if (checkEof()) {
return -1;
}
@@ -474,8 +446,8 @@ public final class ByteChunk implements
/**
* Transfers bytes from the buffer to the specified ByteBuffer. After the
* operation the position of the ByteBuffer will be returned to the one
- * before the operation, the limit will be the position incremented by
- * the number of the transfered bytes.
+ * before the operation, the limit will be the position incremented by the
+ * number of the transfered bytes.
*
* @param to the ByteBuffer into which bytes are to be written.
* @return an integer specifying the actual number of bytes read, or -1 if
@@ -515,53 +487,50 @@ public final class ByteChunk implements
*
* @throws IOException Writing overflow data to the output channel failed
*/
- public void flushBuffer()
- throws IOException
- {
- //assert out!=null
- if( out==null ) {
- throw new IOException( "Buffer overflow, no sink " + limit + " " +
- buff.length );
+ public void flushBuffer() throws IOException {
+ // assert out!=null
+ if (out == null) {
+ throw new IOException("Buffer overflow, no sink " + limit + " " +
buff.length);
}
- out.realWriteBytes( buff, start, end-start );
- end=start;
+ out.realWriteBytes(buff, start, end - start);
+ end = start;
}
+
/**
* Make space for len bytes. If len is small, allocate a reserve space too.
* Never grow bigger than limit.
+ *
* @param count The size
*/
public void makeSpace(int count) {
byte[] tmp = null;
int newSize;
- int desiredSize=end + count;
+ int desiredSize = end + count;
// Can't grow above the limit
- if( limit > 0 &&
- desiredSize > limit) {
- desiredSize=limit;
+ if (limit > 0 && desiredSize > limit) {
+ desiredSize = limit;
}
- if( buff==null ) {
- if( desiredSize < 256 )
- {
- desiredSize=256; // take a minimum
+ if (buff == null) {
+ if (desiredSize < 256) {
+ desiredSize = 256; // take a minimum
}
- buff=new byte[desiredSize];
+ buff = new byte[desiredSize];
}
// limit < buf.length ( the buffer is already big )
// or we already have space XXX
- if( desiredSize <= buff.length ) {
+ if (desiredSize <= buff.length) {
return;
}
// grow in larger chunks
- if( desiredSize < 2 * buff.length ) {
- newSize= buff.length * 2;
+ if (desiredSize < 2 * buff.length) {
+ newSize = buff.length * 2;
} else {
- newSize= buff.length * 2 + count ;
+ newSize = buff.length * 2 + count;
}
if (limit > 0 && newSize > limit) {
@@ -569,25 +538,28 @@ public final class ByteChunk implements
}
tmp = new byte[newSize];
- System.arraycopy(buff, start, tmp, 0, end-start);
+ // Compacts buffer
+ System.arraycopy(buff, start, tmp, 0, end - start);
buff = tmp;
tmp = null;
- end=end-start;
- start=0;
+ end = end - start;
+ start = 0;
}
+
// -------------------- Conversion and getters --------------------
@Override
public String toString() {
if (null == buff) {
return null;
- } else if (end-start == 0) {
+ } else if (end - start == 0) {
return "";
}
return StringCache.toString(this);
}
+
public String toStringInternal() {
if (charset == null) {
charset = DEFAULT_CHARSET;
@@ -595,12 +567,13 @@ public final class ByteChunk implements
// new String(byte[], int, int, Charset) takes a defensive copy of the
// entire byte array. This is expensive if only a small subset of the
// bytes will be used. The code below is from Apache Harmony.
- CharBuffer cb = charset.decode(ByteBuffer.wrap(buff, start,
end-start));
+ CharBuffer cb = charset.decode(ByteBuffer.wrap(buff, start, end -
start));
return new String(cb.array(), cb.arrayOffset(), cb.length());
}
+
public long getLong() {
- return Ascii.parseLong(buff, start,end-start);
+ return Ascii.parseLong(buff, start, end - start);
}
@@ -614,67 +587,75 @@ public final class ByteChunk implements
return false;
}
+
/**
* Compares the message bytes to the specified String object.
+ *
* @param s the String to compare
- * @return true if the comparison succeeded, false otherwise
+ * @return <code>true</code> if the comparison succeeded,
<code>false</code>
+ * otherwise
*/
public boolean equals(String s) {
// XXX ENCODING - this only works if encoding is UTF8-compat
// ( ok for tomcat, where we compare ascii - header names, etc )!!!
byte[] b = buff;
- int blen = end-start;
- if (b == null || blen != s.length()) {
+ int len = end - start;
+ if (b == null || len != s.length()) {
return false;
}
- int boff = start;
- for (int i = 0; i < blen; i++) {
- if (b[boff++] != s.charAt(i)) {
+ int off = start;
+ for (int i = 0; i < len; i++) {
+ if (b[off++] != s.charAt(i)) {
return false;
}
}
return true;
}
+
/**
* Compares the message bytes to the specified String object.
+ *
* @param s the String to compare
- * @return true if the comparison succeeded, false otherwise
+ * @return <code>true</code> if the comparison succeeded,
<code>false</code>
+ * otherwise
*/
public boolean equalsIgnoreCase(String s) {
byte[] b = buff;
- int blen = end-start;
- if (b == null || blen != s.length()) {
+ int len = end - start;
+ if (b == null || len != s.length()) {
return false;
}
- int boff = start;
- for (int i = 0; i < blen; i++) {
- if (Ascii.toLower(b[boff++]) != Ascii.toLower(s.charAt(i))) {
+ int off = start;
+ for (int i = 0; i < len; i++) {
+ if (Ascii.toLower(b[off++]) != Ascii.toLower(s.charAt(i))) {
return false;
}
}
return true;
}
- public boolean equals( ByteChunk bb ) {
- return equals( bb.getBytes(), bb.getStart(), bb.getLength());
+
+ public boolean equals(ByteChunk bb) {
+ return equals(bb.getBytes(), bb.getStart(), bb.getLength());
}
- public boolean equals( byte b2[], int off2, int len2) {
- byte b1[]=buff;
- if( b1==null && b2==null ) {
+
+ public boolean equals(byte b2[], int off2, int len2) {
+ byte b1[] = buff;
+ if (b1 == null && b2 == null) {
return true;
}
- int len=end-start;
- if ( len2 != len || b1==null || b2==null ) {
+ int len = end - start;
+ if (len != len2 || b1 == null || b2 == null) {
return false;
}
int off1 = start;
- while ( len-- > 0) {
+ while (len-- > 0) {
if (b1[off1++] != b2[off2++]) {
return false;
}
@@ -682,116 +663,74 @@ public final class ByteChunk implements
return true;
}
- public boolean equals( CharChunk cc ) {
- return equals( cc.getChars(), cc.getStart(), cc.getLength());
+
+ public boolean equals(CharChunk cc) {
+ return equals(cc.getChars(), cc.getStart(), cc.getLength());
}
- public boolean equals( char c2[], int off2, int len2) {
+
+ public boolean equals(char c2[], int off2, int len2) {
// XXX works only for enc compatible with ASCII/UTF !!!
- byte b1[]=buff;
- if( c2==null && b1==null ) {
+ byte b1[] = buff;
+ if (c2 == null && b1 == null) {
return true;
}
- if (b1== null || c2==null || end-start != len2 ) {
+ if (b1 == null || c2 == null || end - start != len2) {
return false;
}
int off1 = start;
- int len=end-start;
+ int len = end - start;
- while ( len-- > 0) {
- if ( (char)b1[off1++] != c2[off2++]) {
+ while (len-- > 0) {
+ if ((char) b1[off1++] != c2[off2++]) {
return false;
}
}
return true;
}
+
/**
- * Returns true if the message bytes starts with the specified string.
+ * Returns true if the buffer starts with the specified string.
+ *
* @param s the string
* @param pos The position
+ *
* @return <code>true</code> if the start matches
*/
public boolean startsWithIgnoreCase(String s, int pos) {
byte[] b = buff;
int len = s.length();
- if (b == null || len+pos > end-start) {
+ if (b == null || len + pos > end - start) {
return false;
}
- int off = start+pos;
+ int off = start + pos;
for (int i = 0; i < len; i++) {
- if (Ascii.toLower( b[off++] ) != Ascii.toLower( s.charAt(i))) {
+ if (Ascii.toLower(b[off++]) != Ascii.toLower(s.charAt(i))) {
return false;
}
}
return true;
}
- public int indexOf( String src, int srcOff, int srcLen, int myOff ) {
- char first=src.charAt( srcOff );
-
- // Look for first char
- int srcEnd = srcOff + srcLen;
-
- mainLoop:
- for( int i=myOff+start; i <= (end - srcLen); i++ ) {
- if( buff[i] != first ) {
- continue;
- }
- // found first char, now look for a match
- int myPos=i+1;
- for( int srcPos=srcOff + 1; srcPos< srcEnd;) {
- if( buff[myPos++] != src.charAt( srcPos++ )) {
- continue mainLoop;
- }
- }
- return i-start; // found it
- }
- return -1;
- }
-
- // -------------------- Hash code --------------------
@Override
- public int hashCode() {
- if (hasHashCode) {
- return hashCode;
- }
- int code = 0;
-
- code = hash();
- hashCode = code;
- hasHashCode = true;
- return code;
- }
-
- // normal hash.
- public int hash() {
- return hashBytes( buff, start, end-start);
+ protected int getBufferElement(int index) {
+ return buff[index];
}
- private static int hashBytes( byte buff[], int start, int bytesLen ) {
- int max=start+bytesLen;
- byte bb[]=buff;
- int code=0;
- for (int i = start; i < max ; i++) {
- code = code * 37 + bb[i];
- }
- return code;
- }
/**
* Returns the first instance of the given character in this ByteChunk
* starting at the specified byte. If the character is not found, -1 is
- * returned.
- * <br>
+ * returned. <br>
* NOTE: This only works for characters in the range 0-127.
*
- * @param c The character
- * @param starting The start position
- * @return The position of the first instance of the character or
- * -1 if the character is not found.
+ * @param c The character
+ * @param starting The start position
+ * @return The position of the first instance of the character or -1 if the
+ * character is not found.
*/
public int indexOf(char c, int starting) {
int ret = indexOf(buff, start + starting, end, c);
@@ -800,23 +739,22 @@ public final class ByteChunk implements
/**
* Returns the first instance of the given character in the given byte
array
- * between the specified start and end.
- * <br>
+ * between the specified start and end. <br>
* NOTE: This only works for characters in the range 0-127.
*
- * @param bytes The byte array to search
- * @param start The point to start searching from in the byte array
- * @param end The point to stop searching in the byte array
- * @param c The character to search for
- * @return The position of the first instance of the character or -1
- * if the character is not found.
+ * @param bytes The array to search
+ * @param start The point to start searching from in the array
+ * @param end The point to stop searching in the array
+ * @param s The character to search for
+ * @return The position of the first instance of the character or -1 if the
+ * character is not found.
*/
- public static int indexOf(byte bytes[], int start, int end, char c) {
+ public static int indexOf(byte bytes[], int start, int end, char s) {
int offset = start;
while (offset < end) {
- byte b=bytes[offset];
- if (b == c) {
+ byte b = bytes[offset];
+ if (b == s) {
return offset;
}
offset++;
@@ -824,16 +762,17 @@ public final class ByteChunk implements
return -1;
}
+
/**
* Returns the first instance of the given byte in the byte array between
* the specified start and end.
*
* @param bytes The byte array to search
* @param start The point to start searching from in the byte array
- * @param end The point to stop searching in the byte array
- * @param b The byte to search for
- * @return The position of the first instance of the byte or -1 if the
- * byte is not found.
+ * @param end The point to stop searching in the byte array
+ * @param b The byte to search for
+ * @return The position of the first instance of the byte or -1 if the byte
+ * is not found.
*/
public static int findByte(byte bytes[], int start, int end, byte b) {
int offset = start;
@@ -846,22 +785,23 @@ public final class ByteChunk implements
return -1;
}
+
/**
* Returns the first instance of any of the given bytes in the byte array
* between the specified start and end.
*
* @param bytes The byte array to search
* @param start The point to start searching from in the byte array
- * @param end The point to stop searching in the byte array
- * @param b The array of bytes to search for
- * @return The position of the first instance of the byte or -1 if the
- * byte is not found.
+ * @param end The point to stop searching in the byte array
+ * @param b The array of bytes to search for
+ * @return The position of the first instance of the byte or -1 if the byte
+ * is not found.
*/
public static int findBytes(byte bytes[], int start, int end, byte b[]) {
int blen = b.length;
int offset = start;
while (offset < end) {
- for (int i = 0; i < blen; i++) {
+ for (int i = 0; i < blen; i++) {
if (bytes[offset] == b[i]) {
return offset;
}
@@ -871,6 +811,7 @@ public final class ByteChunk implements
return -1;
}
+
/**
* Convert specified String to a byte array. This ONLY WORKS for ascii, UTF
* chars will be truncated.
Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java?rev=1821297&r1=1821296&r2=1821297&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java
(original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java Tue Jan
16 20:01:04 2018
@@ -17,74 +17,66 @@
package org.apache.tomcat.util.buf;
import java.io.IOException;
-import java.io.Serializable;
/**
- * Utilities to manipulate char chunks. While String is
- * the easiest way to manipulate chars ( search, substrings, etc),
- * it is known to not be the most efficient solution - Strings are
- * designed as immutable and secure objects.
+ * Utilities to manipulate char chunks. While String is the easiest way to
+ * manipulate chars ( search, substrings, etc), it is known to not be the most
+ * efficient solution - Strings are designed as immutable and secure objects.
*
* @author [email protected]
* @author James Todd [[email protected]]
* @author Costin Manolache
* @author Remy Maucherat
*/
-public final class CharChunk implements Cloneable, Serializable, CharSequence {
+public final class CharChunk extends AbstractChunk implements CharSequence {
private static final long serialVersionUID = 1L;
- // Input interface, used when the buffer is emptied.
+ /**
+ * Input interface, used when the buffer is empty.
+ */
public static interface CharInputChannel {
+
/**
* Read new characters.
*
* @return The number of characters read
*
- * @throws IOException If an I/O error occurs reading the characters
+ * @throws IOException If an I/O error occurs during reading
*/
public int realReadChars() throws IOException;
}
+
/**
- * When we need more space we'll either
- * grow the buffer ( up to the limit ) or send it to a channel.
+ * When we need more space we'll either grow the buffer ( up to the limit )
+ * or send it to a channel.
*/
public static interface CharOutputChannel {
+
/**
- * Send the bytes ( usually the internal conversion buffer ).
- * Expect 8k output if the buffer is full.
+ * Send the bytes ( usually the internal conversion buffer ). Expect 8k
+ * output if the buffer is full.
*
- * @param cbuf characters that will be written
+ * @param buf characters that will be written
* @param off offset in the characters array
* @param len length that will be written
* @throws IOException If an I/O occurs while writing the characters
*/
- public void realWriteChars(char cbuf[], int off, int len)
- throws IOException;
+ public void realWriteChars(char buf[], int off, int len) throws
IOException;
}
// --------------------
- private int hashCode = 0;
- // did we compute the hashcode ?
- private boolean hasHashCode = false;
-
// char[]
- private char buff[];
-
- private int start;
- private int end;
-
- private boolean isSet=false; // XXX
+ private char[] buff;
// -1: grow indefinitely
// maximum amount to be cached
- private int limit=-1;
+ private int limit = -1;
private CharInputChannel in = null;
private CharOutputChannel out = null;
- private boolean optimizedWrite=true;
/**
* Creates a new, uninitialized CharChunk object.
@@ -92,10 +84,12 @@ public final class CharChunk implements
public CharChunk() {
}
- public CharChunk(int size) {
- allocate( size, -1 );
+
+ public CharChunk(int initial) {
+ allocate(initial, -1);
}
+
// --------------------
@Override
@@ -103,186 +97,147 @@ public final class CharChunk implements
return super.clone();
}
- public boolean isNull() {
- if( end > 0 ) {
- return false;
- }
- return !isSet; //XXX
- }
- /**
- * Resets the message bytes to an uninitialized state.
- */
- public void recycle() {
- // buff=null;
- isSet=false; // XXX
+ // -------------------- Setup --------------------
+
+ public void allocate(int initial, int limit) {
+ if (buff == null || buff.length < initial) {
+ buff = new char[initial];
+ }
+ this.limit = limit;
+ start = 0;
+ end = 0;
+ isSet = true;
hasHashCode = false;
- start=0;
- end=0;
}
- // -------------------- Setup --------------------
- public void allocate( int initial, int limit ) {
- if( buff==null || buff.length < initial ) {
- buff=new char[initial];
- }
- this.limit=limit;
- start=0;
- end=0;
- isSet=true;
+ /**
+ * Sets the buffer to the specified subarray of characters.
+ *
+ * @param c the characters
+ * @param off the start offset of the characters
+ * @param len the length of the characters
+ */
+ public void setChars(char[] c, int off, int len) {
+ buff = c;
+ start = off;
+ end = start + len;
+ isSet = true;
hasHashCode = false;
}
- public void setOptimizedWrite(boolean optimizedWrite) {
- this.optimizedWrite = optimizedWrite;
+ /**
+ * @return the buffer.
+ */
+ public char[] getChars() {
+ return getBuffer();
}
- public void setChars( char[] c, int off, int len ) {
- buff=c;
- start=off;
- end=start + len;
- isSet=true;
- hasHashCode = false;
+
+ /**
+ * @return the buffer.
+ */
+ public char[] getBuffer() {
+ return buff;
}
+
/**
- * Maximum amount of data in this buffer.
- * If -1 or not set, the buffer will grow indefinitely.
- * Can be smaller than the current buffer size ( which will not shrink ).
- * When the limit is reached, the buffer will be flushed ( if out is set )
- * or throw exception.
+ * Maximum amount of data in this buffer. If -1 or not set, the buffer will
+ * grow indefinitely. Can be smaller than the current buffer size ( which
+ * will not shrink ). When the limit is reached, the buffer will be flushed
+ * ( if out is set ) or throw exception.
+ *
* @param limit The new limit
*/
public void setLimit(int limit) {
- this.limit=limit;
+ this.limit = limit;
}
+
public int getLimit() {
return limit;
}
+
/**
* When the buffer is empty, read the data from the input channel.
+ *
* @param in The input channel
*/
public void setCharInputChannel(CharInputChannel in) {
this.in = in;
}
+
/**
- * When the buffer is full, write the data to the output channel.
- * Also used when large amount of data is appended.
- * If not set, the buffer will grow to the limit.
+ * When the buffer is full, write the data to the output channel. Also used
+ * when large amount of data is appended. If not set, the buffer will grow
+ * to the limit.
+ *
* @param out The output channel
*/
public void setCharOutputChannel(CharOutputChannel out) {
- this.out=out;
- }
-
- // compat
- public char[] getChars()
- {
- return getBuffer();
- }
-
- public char[] getBuffer()
- {
- return buff;
- }
-
- /**
- * @return the start offset of the chars.
- * For output this is the end of the buffer.
- */
- public int getStart() {
- return start;
- }
-
- public int getOffset() {
- return start;
- }
-
- /**
- * @param off The offset
- */
- public void setOffset(int off) {
- start=off;
- }
-
- /**
- * @return the length of the bytes.
- */
- public int getLength() {
- return end-start;
+ this.out = out;
}
- public int getEnd() {
- return end;
- }
+ // -------------------- Adding data to the buffer --------------------
- public void setEnd( int i ) {
- end=i;
- }
-
- // -------------------- Adding data --------------------
-
- public void append( char b )
- throws IOException
- {
- makeSpace( 1 );
+ public void append(char b) throws IOException {
+ makeSpace(1);
// couldn't make space
- if( limit >0 && end >= limit ) {
+ if (limit > 0 && end >= limit) {
flushBuffer();
}
- buff[end++]=b;
+ buff[end++] = b;
}
- public void append( CharChunk src )
- throws IOException
- {
- append( src.getBuffer(), src.getOffset(), src.getLength());
+
+ public void append(CharChunk src) throws IOException {
+ append(src.getBuffer(), src.getOffset(), src.getLength());
}
+
/**
* Add data to the buffer.
+ *
* @param src Char array
* @param off Offset
* @param len Length
* @throws IOException Writing overflow data to the output channel failed
*/
- public void append( char src[], int off, int len )
- throws IOException
- {
+ public void append(char src[], int off, int len) throws IOException {
// will grow, up to limit
- makeSpace( len );
+ makeSpace(len);
// if we don't have limit: makeSpace can grow as it wants
- if( limit < 0 ) {
+ if (limit < 0) {
// assert: makeSpace made enough space
- System.arraycopy( src, off, buff, end, len );
- end+=len;
+ System.arraycopy(src, off, buff, end, len);
+ end += len;
return;
}
// Optimize on a common case.
- // If the source is going to fill up all the space in buffer, may
- // as well write it directly to the output, and avoid an extra copy
- if ( optimizedWrite && len == limit && end == start && out != null ) {
- out.realWriteChars( src, off, len );
+ // If the buffer is empty and the source is going to fill up all the
+ // space in buffer, may as well write it directly to the output,
+ // and avoid an extra copy
+ if (len == limit && end == start && out != null) {
+ out.realWriteChars(src, off, len);
return;
}
// if we have limit and we're below
- if( len <= limit - end ) {
+ if (len <= limit - end) {
// makeSpace will grow the buffer to the limit,
// so we have space
- System.arraycopy( src, off, buff, end, len );
+ System.arraycopy(src, off, buff, end, len);
- end+=len;
+ end += len;
return;
}
@@ -298,32 +253,34 @@ public final class CharChunk implements
// and still have some space for more. We'll still have 2 writes, but
// we write more on the first.
- if( len + end < 2 * limit ) {
- /* If the request length exceeds the size of the output buffer,
- flush the output buffer and then write the data directly.
- We can't avoid 2 writes, but we can write more on the second
- */
- int avail=limit-end;
+ if (len + end < 2 * limit) {
+ /*
+ * If the request length exceeds the size of the output buffer,
+ * flush the output buffer and then write the data directly. We
+ * can't avoid 2 writes, but we can write more on the second
+ */
+ int avail = limit - end;
System.arraycopy(src, off, buff, end, avail);
end += avail;
flushBuffer();
- System.arraycopy(src, off+avail, buff, end, len - avail);
- end+= len - avail;
+ System.arraycopy(src, off + avail, buff, end, len - avail);
+ end += len - avail;
- } else { // len > buf.length + avail
+ } else { // len > buf.length + avail
// long write - flush the buffer and write the rest
// directly from source
flushBuffer();
- out.realWriteChars( src, off, len );
+ out.realWriteChars(src, off, len);
}
}
/**
* Append a string to the buffer.
+ *
* @param s The string
* @throws IOException Writing overflow data to the output channel failed
*/
@@ -331,26 +288,28 @@ public final class CharChunk implements
append(s, 0, s.length());
}
+
/**
* Append a string to the buffer.
+ *
* @param s The string
* @param off Offset
* @param len Length
* @throws IOException Writing overflow data to the output channel failed
*/
public void append(String s, int off, int len) throws IOException {
- if (s==null) {
+ if (s == null) {
return;
}
// will grow, up to limit
- makeSpace( len );
+ makeSpace(len);
// if we don't have limit: makeSpace can grow as it wants
- if( limit < 0 ) {
+ if (limit < 0) {
// assert: makeSpace made enough space
- s.getChars(off, off+len, buff, end );
- end+=len;
+ s.getChars(off, off + len, buff, end);
+ end += len;
return;
}
@@ -358,7 +317,7 @@ public final class CharChunk implements
int sEnd = off + len;
while (sOff < sEnd) {
int d = min(limit - end, sEnd - sOff);
- s.getChars( sOff, sOff+d, buff, end);
+ s.getChars(sOff, sOff + d, buff, end);
sOff += d;
end += d;
if (end >= limit) {
@@ -367,32 +326,21 @@ public final class CharChunk implements
}
}
+
// -------------------- Removing data from the buffer --------------------
public int substract() throws IOException {
- if ((end - start) == 0) {
- if (in == null) {
- return -1;
- }
- int n = in.realReadChars();
- if (n < 0) {
- return -1;
- }
+ if (checkEof()) {
+ return -1;
}
- return (buff[start++]);
+ return buff[start++];
}
+
public int substract(char dest[], int off, int len) throws IOException {
- if ((end - start) == 0) {
- if (in == null) {
- return -1;
- }
- int n = in.realReadChars();
- if (n < 0) {
- return -1;
- }
+ if (checkEof()) {
+ return -1;
}
-
int n = len;
if (len > getLength()) {
n = getLength();
@@ -403,52 +351,70 @@ public final class CharChunk implements
}
+ private boolean checkEof() throws IOException {
+ if ((end - start) == 0) {
+ if (in == null) {
+ return true;
+ }
+ int n = in.realReadChars();
+ if (n < 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Send the buffer to the sink. Called by append() when the limit is
+ * reached. You can also call it explicitly to force the data to be
written.
+ *
+ * @throws IOException Writing overflow data to the output channel failed
+ */
public void flushBuffer() throws IOException {
- //assert out!=null
- if( out==null ) {
- throw new IOException( "Buffer overflow, no sink " + limit + " " +
- buff.length );
+ // assert out!=null
+ if (out == null) {
+ throw new IOException("Buffer overflow, no sink " + limit + " " +
buff.length);
}
- out.realWriteChars( buff, start, end - start );
- end=start;
+ out.realWriteChars(buff, start, end - start);
+ end = start;
}
+
/**
- * Make space for len chars. If len is small, allocate
- * a reserve space too. Never grow bigger than limit.
+ * Make space for len chars. If len is small, allocate a reserve space too.
+ * Never grow bigger than limit.
+ *
* @param count The size
*/
- public void makeSpace(int count)
- {
+ public void makeSpace(int count) {
char[] tmp = null;
int newSize;
- int desiredSize=end + count;
+ int desiredSize = end + count;
// Can't grow above the limit
- if( limit > 0 &&
- desiredSize > limit) {
- desiredSize=limit;
+ if (limit > 0 && desiredSize > limit) {
+ desiredSize = limit;
}
- if( buff==null ) {
- if( desiredSize < 256 )
- {
- desiredSize=256; // take a minimum
+ if (buff == null) {
+ if (desiredSize < 256) {
+ desiredSize = 256; // take a minimum
}
- buff=new char[desiredSize];
+ buff = new char[desiredSize];
}
// limit < buf.length ( the buffer is already big )
// or we already have space XXX
- if( desiredSize <= buff.length) {
+ if (desiredSize <= buff.length) {
return;
}
// grow in larger chunks
- if( desiredSize < 2 * buff.length ) {
- newSize= buff.length * 2;
+ if (desiredSize < 2 * buff.length) {
+ newSize = buff.length * 2;
} else {
- newSize= buff.length * 2 + count ;
+ newSize = buff.length * 2 + count;
}
if (limit > 0 && newSize > limit) {
@@ -456,27 +422,31 @@ public final class CharChunk implements
}
tmp = new char[newSize];
+ // Some calling code assumes buffer will not be compacted
System.arraycopy(buff, 0, tmp, 0, end);
buff = tmp;
tmp = null;
}
+
// -------------------- Conversion and getters --------------------
@Override
public String toString() {
if (null == buff) {
return null;
- } else if (end-start == 0) {
+ } else if (end - start == 0) {
return "";
}
return StringCache.toString(this);
}
+
public String toStringInternal() {
- return new String(buff, start, end-start);
+ return new String(buff, start, end - start);
}
+
// -------------------- equals --------------------
@Override
@@ -487,14 +457,17 @@ public final class CharChunk implements
return false;
}
+
/**
* Compares the message bytes to the specified String object.
+ *
* @param s the String to compare
- * @return <code>true</code> if the comparison succeeded,
<code>false</code> otherwise
+ * @return <code>true</code> if the comparison succeeded,
<code>false</code>
+ * otherwise
*/
public boolean equals(String s) {
char[] c = buff;
- int len = end-start;
+ int len = end - start;
if (c == null || len != s.length()) {
return false;
}
@@ -507,42 +480,49 @@ public final class CharChunk implements
return true;
}
+
/**
* Compares the message bytes to the specified String object.
+ *
* @param s the String to compare
- * @return <code>true</code> if the comparison succeeded,
<code>false</code> otherwise
+ * @return <code>true</code> if the comparison succeeded,
<code>false</code>
+ * otherwise
*/
public boolean equalsIgnoreCase(String s) {
char[] c = buff;
- int len = end-start;
+ int len = end - start;
if (c == null || len != s.length()) {
return false;
}
int off = start;
for (int i = 0; i < len; i++) {
- if (Ascii.toLower( c[off++] ) != Ascii.toLower( s.charAt(i))) {
+ if (Ascii.toLower(c[off++]) != Ascii.toLower(s.charAt(i))) {
return false;
}
}
return true;
}
+
public boolean equals(CharChunk cc) {
- return equals( cc.getChars(), cc.getOffset(), cc.getLength());
+ return equals(cc.getChars(), cc.getOffset(), cc.getLength());
}
+
public boolean equals(char b2[], int off2, int len2) {
- char b1[]=buff;
- if( b1==null && b2==null ) {
+ char b1[] = buff;
+ if (b1 == null && b2 == null) {
return true;
}
- if (b1== null || b2==null || end-start != len2) {
+ int len = end - start;
+ if (len != len2 || b1 == null || b2 == null) {
return false;
}
+
int off1 = start;
- int len=end-start;
- while ( len-- > 0) {
+
+ while (len-- > 0) {
if (b1[off1++] != b2[off2++]) {
return false;
}
@@ -550,14 +530,16 @@ public final class CharChunk implements
return true;
}
+
/**
- * @return <code>true</code> if the message bytes starts with the
specified string.
+ * @return <code>true</code> if the message bytes starts with the specified
+ * string.
* @param s The string
*/
public boolean startsWith(String s) {
char[] c = buff;
int len = s.length();
- if (c == null || len > end-start) {
+ if (c == null || len > end - start) {
return false;
}
int off = start;
@@ -569,20 +551,24 @@ public final class CharChunk implements
return true;
}
+
/**
- * @return <code>true</code> if the message bytes starts with the
specified string.
- * @param s The string
- * @param pos The position at which the comparison will be made
+ * Returns true if the buffer starts with the specified string.
+ *
+ * @param s the string
+ * @param pos The position
+ *
+ * @return <code>true</code> if the start matches
*/
public boolean startsWithIgnoreCase(String s, int pos) {
char[] c = buff;
int len = s.length();
- if (c == null || len+pos > end-start) {
+ if (c == null || len + pos > end - start) {
return false;
}
- int off = start+pos;
+ int off = start + pos;
for (int i = 0; i < len; i++) {
- if (Ascii.toLower( c[off++] ) != Ascii.toLower( s.charAt(i))) {
+ if (Ascii.toLower(c[off++]) != Ascii.toLower(s.charAt(i))) {
return false;
}
}
@@ -591,13 +577,14 @@ public final class CharChunk implements
/**
- * @return <code>true</code> if the message bytes end with the specified
string.
+ * @return <code>true</code> if the message bytes end with the specified
+ * string.
* @param s The string
*/
public boolean endsWith(String s) {
char[] c = buff;
int len = s.length();
- if (c == null || len > end-start) {
+ if (c == null || len > end - start) {
return false;
}
int off = end - len;
@@ -609,82 +596,59 @@ public final class CharChunk implements
return true;
}
- // -------------------- Hash code --------------------
@Override
- public int hashCode() {
- if (hasHashCode) {
- return hashCode;
- }
- int code = 0;
-
- code = hash();
- hashCode = code;
- hasHashCode = true;
- return code;
+ protected int getBufferElement(int index) {
+ return buff[index];
}
- // normal hash.
- public int hash() {
- int code=0;
- for (int i = start; i < start + end-start; i++) {
- code = code * 37 + buff[i];
- }
- return code;
- }
public int indexOf(char c) {
- return indexOf( c, start);
+ return indexOf(c, start);
}
+
/**
- * @return <code>true</code> if the message bytes starts with the
specified string.
- * @param c the character
- * @param starting Start position
+ * Returns the first instance of the given character in this CharChunk
+ * starting at the specified char. If the character is not found, -1 is
+ * returned. <br>
+ *
+ * @param c The character
+ * @param starting The start position
+ * @return The position of the first instance of the character or -1 if the
+ * character is not found.
*/
public int indexOf(char c, int starting) {
- int ret = indexOf( buff, start+starting, end, c );
+ int ret = indexOf(buff, start + starting, end, c);
return (ret >= start) ? ret - start : -1;
}
- public static int indexOf( char chars[], int off, int cend, char qq )
- {
- while( off < cend ) {
- char b=chars[off];
- if( b==qq ) {
- return off;
- }
- off++;
- }
- return -1;
- }
-
- public int indexOf( String src, int srcOff, int srcLen, int myOff ) {
- char first=src.charAt( srcOff );
-
- // Look for first char
- int srcEnd = srcOff + srcLen;
-
- for( int i=myOff+start; i <= (end - srcLen); i++ ) {
- if( buff[i] != first ) {
- continue;
- }
- // found first char, now look for a match
- int myPos=i+1;
- for( int srcPos=srcOff + 1; srcPos< srcEnd;) {
- if( buff[myPos++] != src.charAt( srcPos++ )) {
- break;
- }
- if( srcPos==srcEnd )
- {
- return i-start; // found it
- }
+ /**
+ * Returns the first instance of the given character in the given char
array
+ * between the specified start and end. <br>
+ *
+ * @param chars The array to search
+ * @param start The point to start searching from in the array
+ * @param end The point to stop searching in the array
+ * @param s The character to search for
+ * @return The position of the first instance of the character or -1 if the
+ * character is not found.
+ */
+ public static int indexOf(char chars[], int start, int end, char s) {
+ int offset = start;
+
+ while (offset < end) {
+ char c = chars[offset];
+ if (c == s) {
+ return offset;
}
+ offset++;
}
return -1;
}
+
// -------------------- utils
private int min(int a, int b) {
if (a < b) {
@@ -693,6 +657,7 @@ public final class CharChunk implements
return b;
}
+
// Char sequence impl
@Override
@@ -700,6 +665,7 @@ public final class CharChunk implements
return buff[index + start];
}
+
@Override
public CharSequence subSequence(int start, int end) {
try {
@@ -713,9 +679,21 @@ public final class CharChunk implements
}
}
+
@Override
public int length() {
return end - start;
}
+ /**
+ * NO-OP.
+ *
+ * @param optimizedWrite Ignored
+ *
+ * @deprecated Unused code. This is now a NO-OP and will be removed without
+ * replacement in Tomcat 10.
+ */
+ @Deprecated
+ public void setOptimizedWrite(boolean optimizedWrite) {
+ }
}
Modified:
tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java?rev=1821297&r1=1821296&r2=1821297&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java
(original)
+++ tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java Tue
Jan 16 20:01:04 2018
@@ -36,4 +36,30 @@ public class TestCharChunk {
Assert.assertFalse(cc.endsWith("x"));
Assert.assertFalse(cc.endsWith("xxtest"));
}
+
+ @Test
+ public void testIndexOf_String() {
+ char[] chars = "Hello\u00a0world".toCharArray();
+ final int len = chars.length;
+
+ CharChunk cc = new CharChunk();
+ cc.setChars(chars, 0, len);
+
+ Assert.assertEquals(0, cc.indexOf("Hello", 0, "Hello".length(), 0));
+ Assert.assertEquals(2, cc.indexOf("ll", 0, 2, 0));
+ Assert.assertEquals(2, cc.indexOf("Hello", 2, 2, 0));
+
+ Assert.assertEquals(7, cc.indexOf("o", 0, 1, 5));
+
+ // Does work outside of 0-127 (unlike ByteChunk)
+ Assert.assertEquals(5, cc.indexOf("\u00a0", 0, 1, 0));
+
+ cc.setChars(chars, 6, 5);
+ Assert.assertEquals(1, cc.indexOf("o", 0, 1, 0));
+
+ cc.setChars(chars, 6, 2);
+ Assert.assertEquals(0, cc.indexOf("wo", 0, 1, 0));
+ Assert.assertEquals(-1, cc.indexOf("d", 0, 1, 0));
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]