aboutsummaryrefslogtreecommitdiff
path: root/Foundation/GTMNSString+HTML.m
diff options
context:
space:
mode:
authorGravatar dmaclach <dmaclach@google.com>2016-10-07 12:10:23 -0400
committerGravatar Thomas Van Lenten <thomasvl@google.com>2016-10-07 12:21:06 -0400
commit42124b3691197c3c4f52f069775fa0390a8ff942 (patch)
treeebd373d398ea64b45bdc1d196fa0a2c5f57cabfd /Foundation/GTMNSString+HTML.m
parent57eeab4193210df8ab0c81e9d3f1ee1ad3e24492 (diff)
First cut at pruning things/updating things.
Remove a bunch of code that Google stopped using/maintaining rather than trying to update it it. Some would be hard to update, some actually has system provided replacements; others are patterns that just don't seem as common now. Prune out the code related to macOS <= 10.5, start pruning some of the really old iOS support also. Get the projects mostly limping again with modern Xcodes so tests can be run. If someone ends up on this commit via history for something they still find as useful, feel free to do a pull request to bring the snippet of code back to life and update it for current SDKs.
Diffstat (limited to 'Foundation/GTMNSString+HTML.m')
-rw-r--r--Foundation/GTMNSString+HTML.m513
1 files changed, 259 insertions, 254 deletions
diff --git a/Foundation/GTMNSString+HTML.m b/Foundation/GTMNSString+HTML.m
index d580b9e..04ec23a 100644
--- a/Foundation/GTMNSString+HTML.m
+++ b/Foundation/GTMNSString+HTML.m
@@ -7,9 +7,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -20,6 +20,11 @@
#import "GTMDefines.h"
#import "GTMNSString+HTML.h"
+// Export a nonsense symbol to suppress a libtool warning when this is linked
+// alone in a static lib.
+__attribute__((visibility("default")))
+ char GTMNSString_HTMLExportToSuppressLibToolWarning = 0;
+
typedef struct {
NSString *escapeSequence;
unichar uchar;
@@ -34,105 +39,105 @@ static HTMLEscapeMap gAsciiHTMLEscapeMap[] = {
{ @"&apos;", 39 },
{ @"&lt;", 60 },
{ @"&gt;", 62 },
-
+
// A.2.1. Latin-1 characters
- { @"&nbsp;", 160 },
- { @"&iexcl;", 161 },
- { @"&cent;", 162 },
- { @"&pound;", 163 },
- { @"&curren;", 164 },
- { @"&yen;", 165 },
- { @"&brvbar;", 166 },
- { @"&sect;", 167 },
- { @"&uml;", 168 },
- { @"&copy;", 169 },
- { @"&ordf;", 170 },
- { @"&laquo;", 171 },
- { @"&not;", 172 },
- { @"&shy;", 173 },
- { @"&reg;", 174 },
- { @"&macr;", 175 },
- { @"&deg;", 176 },
- { @"&plusmn;", 177 },
- { @"&sup2;", 178 },
- { @"&sup3;", 179 },
- { @"&acute;", 180 },
- { @"&micro;", 181 },
- { @"&para;", 182 },
- { @"&middot;", 183 },
- { @"&cedil;", 184 },
- { @"&sup1;", 185 },
- { @"&ordm;", 186 },
- { @"&raquo;", 187 },
- { @"&frac14;", 188 },
- { @"&frac12;", 189 },
- { @"&frac34;", 190 },
- { @"&iquest;", 191 },
- { @"&Agrave;", 192 },
- { @"&Aacute;", 193 },
- { @"&Acirc;", 194 },
- { @"&Atilde;", 195 },
- { @"&Auml;", 196 },
- { @"&Aring;", 197 },
- { @"&AElig;", 198 },
- { @"&Ccedil;", 199 },
- { @"&Egrave;", 200 },
- { @"&Eacute;", 201 },
- { @"&Ecirc;", 202 },
- { @"&Euml;", 203 },
- { @"&Igrave;", 204 },
- { @"&Iacute;", 205 },
- { @"&Icirc;", 206 },
- { @"&Iuml;", 207 },
- { @"&ETH;", 208 },
- { @"&Ntilde;", 209 },
- { @"&Ograve;", 210 },
- { @"&Oacute;", 211 },
- { @"&Ocirc;", 212 },
- { @"&Otilde;", 213 },
- { @"&Ouml;", 214 },
- { @"&times;", 215 },
- { @"&Oslash;", 216 },
- { @"&Ugrave;", 217 },
- { @"&Uacute;", 218 },
- { @"&Ucirc;", 219 },
- { @"&Uuml;", 220 },
- { @"&Yacute;", 221 },
- { @"&THORN;", 222 },
- { @"&szlig;", 223 },
- { @"&agrave;", 224 },
- { @"&aacute;", 225 },
- { @"&acirc;", 226 },
- { @"&atilde;", 227 },
- { @"&auml;", 228 },
- { @"&aring;", 229 },
- { @"&aelig;", 230 },
- { @"&ccedil;", 231 },
- { @"&egrave;", 232 },
- { @"&eacute;", 233 },
- { @"&ecirc;", 234 },
- { @"&euml;", 235 },
- { @"&igrave;", 236 },
- { @"&iacute;", 237 },
- { @"&icirc;", 238 },
- { @"&iuml;", 239 },
- { @"&eth;", 240 },
- { @"&ntilde;", 241 },
- { @"&ograve;", 242 },
- { @"&oacute;", 243 },
- { @"&ocirc;", 244 },
- { @"&otilde;", 245 },
- { @"&ouml;", 246 },
- { @"&divide;", 247 },
- { @"&oslash;", 248 },
- { @"&ugrave;", 249 },
- { @"&uacute;", 250 },
- { @"&ucirc;", 251 },
- { @"&uuml;", 252 },
- { @"&yacute;", 253 },
- { @"&thorn;", 254 },
+ { @"&nbsp;", 160 },
+ { @"&iexcl;", 161 },
+ { @"&cent;", 162 },
+ { @"&pound;", 163 },
+ { @"&curren;", 164 },
+ { @"&yen;", 165 },
+ { @"&brvbar;", 166 },
+ { @"&sect;", 167 },
+ { @"&uml;", 168 },
+ { @"&copy;", 169 },
+ { @"&ordf;", 170 },
+ { @"&laquo;", 171 },
+ { @"&not;", 172 },
+ { @"&shy;", 173 },
+ { @"&reg;", 174 },
+ { @"&macr;", 175 },
+ { @"&deg;", 176 },
+ { @"&plusmn;", 177 },
+ { @"&sup2;", 178 },
+ { @"&sup3;", 179 },
+ { @"&acute;", 180 },
+ { @"&micro;", 181 },
+ { @"&para;", 182 },
+ { @"&middot;", 183 },
+ { @"&cedil;", 184 },
+ { @"&sup1;", 185 },
+ { @"&ordm;", 186 },
+ { @"&raquo;", 187 },
+ { @"&frac14;", 188 },
+ { @"&frac12;", 189 },
+ { @"&frac34;", 190 },
+ { @"&iquest;", 191 },
+ { @"&Agrave;", 192 },
+ { @"&Aacute;", 193 },
+ { @"&Acirc;", 194 },
+ { @"&Atilde;", 195 },
+ { @"&Auml;", 196 },
+ { @"&Aring;", 197 },
+ { @"&AElig;", 198 },
+ { @"&Ccedil;", 199 },
+ { @"&Egrave;", 200 },
+ { @"&Eacute;", 201 },
+ { @"&Ecirc;", 202 },
+ { @"&Euml;", 203 },
+ { @"&Igrave;", 204 },
+ { @"&Iacute;", 205 },
+ { @"&Icirc;", 206 },
+ { @"&Iuml;", 207 },
+ { @"&ETH;", 208 },
+ { @"&Ntilde;", 209 },
+ { @"&Ograve;", 210 },
+ { @"&Oacute;", 211 },
+ { @"&Ocirc;", 212 },
+ { @"&Otilde;", 213 },
+ { @"&Ouml;", 214 },
+ { @"&times;", 215 },
+ { @"&Oslash;", 216 },
+ { @"&Ugrave;", 217 },
+ { @"&Uacute;", 218 },
+ { @"&Ucirc;", 219 },
+ { @"&Uuml;", 220 },
+ { @"&Yacute;", 221 },
+ { @"&THORN;", 222 },
+ { @"&szlig;", 223 },
+ { @"&agrave;", 224 },
+ { @"&aacute;", 225 },
+ { @"&acirc;", 226 },
+ { @"&atilde;", 227 },
+ { @"&auml;", 228 },
+ { @"&aring;", 229 },
+ { @"&aelig;", 230 },
+ { @"&ccedil;", 231 },
+ { @"&egrave;", 232 },
+ { @"&eacute;", 233 },
+ { @"&ecirc;", 234 },
+ { @"&euml;", 235 },
+ { @"&igrave;", 236 },
+ { @"&iacute;", 237 },
+ { @"&icirc;", 238 },
+ { @"&iuml;", 239 },
+ { @"&eth;", 240 },
+ { @"&ntilde;", 241 },
+ { @"&ograve;", 242 },
+ { @"&oacute;", 243 },
+ { @"&ocirc;", 244 },
+ { @"&otilde;", 245 },
+ { @"&ouml;", 246 },
+ { @"&divide;", 247 },
+ { @"&oslash;", 248 },
+ { @"&ugrave;", 249 },
+ { @"&uacute;", 250 },
+ { @"&ucirc;", 251 },
+ { @"&uuml;", 252 },
+ { @"&yacute;", 253 },
+ { @"&thorn;", 254 },
{ @"&yuml;", 255 },
-
+
// A.2.2. Special characters cont'd
{ @"&OElig;", 338 },
{ @"&oelig;", 339 },
@@ -141,66 +146,66 @@ static HTMLEscapeMap gAsciiHTMLEscapeMap[] = {
{ @"&Yuml;", 376 },
// A.2.3. Symbols
- { @"&fnof;", 402 },
+ { @"&fnof;", 402 },
// A.2.2. Special characters cont'd
{ @"&circ;", 710 },
{ @"&tilde;", 732 },
-
+
// A.2.3. Symbols cont'd
- { @"&Alpha;", 913 },
- { @"&Beta;", 914 },
- { @"&Gamma;", 915 },
- { @"&Delta;", 916 },
- { @"&Epsilon;", 917 },
- { @"&Zeta;", 918 },
- { @"&Eta;", 919 },
- { @"&Theta;", 920 },
- { @"&Iota;", 921 },
- { @"&Kappa;", 922 },
- { @"&Lambda;", 923 },
- { @"&Mu;", 924 },
- { @"&Nu;", 925 },
- { @"&Xi;", 926 },
- { @"&Omicron;", 927 },
- { @"&Pi;", 928 },
- { @"&Rho;", 929 },
- { @"&Sigma;", 931 },
- { @"&Tau;", 932 },
- { @"&Upsilon;", 933 },
- { @"&Phi;", 934 },
- { @"&Chi;", 935 },
- { @"&Psi;", 936 },
- { @"&Omega;", 937 },
- { @"&alpha;", 945 },
- { @"&beta;", 946 },
- { @"&gamma;", 947 },
- { @"&delta;", 948 },
- { @"&epsilon;", 949 },
- { @"&zeta;", 950 },
- { @"&eta;", 951 },
- { @"&theta;", 952 },
- { @"&iota;", 953 },
- { @"&kappa;", 954 },
- { @"&lambda;", 955 },
- { @"&mu;", 956 },
- { @"&nu;", 957 },
- { @"&xi;", 958 },
- { @"&omicron;", 959 },
- { @"&pi;", 960 },
- { @"&rho;", 961 },
- { @"&sigmaf;", 962 },
- { @"&sigma;", 963 },
- { @"&tau;", 964 },
- { @"&upsilon;", 965 },
- { @"&phi;", 966 },
- { @"&chi;", 967 },
- { @"&psi;", 968 },
- { @"&omega;", 969 },
- { @"&thetasym;", 977 },
- { @"&upsih;", 978 },
- { @"&piv;", 982 },
-
+ { @"&Alpha;", 913 },
+ { @"&Beta;", 914 },
+ { @"&Gamma;", 915 },
+ { @"&Delta;", 916 },
+ { @"&Epsilon;", 917 },
+ { @"&Zeta;", 918 },
+ { @"&Eta;", 919 },
+ { @"&Theta;", 920 },
+ { @"&Iota;", 921 },
+ { @"&Kappa;", 922 },
+ { @"&Lambda;", 923 },
+ { @"&Mu;", 924 },
+ { @"&Nu;", 925 },
+ { @"&Xi;", 926 },
+ { @"&Omicron;", 927 },
+ { @"&Pi;", 928 },
+ { @"&Rho;", 929 },
+ { @"&Sigma;", 931 },
+ { @"&Tau;", 932 },
+ { @"&Upsilon;", 933 },
+ { @"&Phi;", 934 },
+ { @"&Chi;", 935 },
+ { @"&Psi;", 936 },
+ { @"&Omega;", 937 },
+ { @"&alpha;", 945 },
+ { @"&beta;", 946 },
+ { @"&gamma;", 947 },
+ { @"&delta;", 948 },
+ { @"&epsilon;", 949 },
+ { @"&zeta;", 950 },
+ { @"&eta;", 951 },
+ { @"&theta;", 952 },
+ { @"&iota;", 953 },
+ { @"&kappa;", 954 },
+ { @"&lambda;", 955 },
+ { @"&mu;", 956 },
+ { @"&nu;", 957 },
+ { @"&xi;", 958 },
+ { @"&omicron;", 959 },
+ { @"&pi;", 960 },
+ { @"&rho;", 961 },
+ { @"&sigmaf;", 962 },
+ { @"&sigma;", 963 },
+ { @"&tau;", 964 },
+ { @"&upsilon;", 965 },
+ { @"&phi;", 966 },
+ { @"&chi;", 967 },
+ { @"&psi;", 968 },
+ { @"&omega;", 969 },
+ { @"&thetasym;", 977 },
+ { @"&upsih;", 978 },
+ { @"&piv;", 982 },
+
// A.2.2. Special characters cont'd
{ @"&ensp;", 8194 },
{ @"&emsp;", 8195 },
@@ -219,93 +224,93 @@ static HTMLEscapeMap gAsciiHTMLEscapeMap[] = {
{ @"&bdquo;", 8222 },
{ @"&dagger;", 8224 },
{ @"&Dagger;", 8225 },
- // A.2.3. Symbols cont'd
- { @"&bull;", 8226 },
- { @"&hellip;", 8230 },
-
+ // A.2.3. Symbols cont'd
+ { @"&bull;", 8226 },
+ { @"&hellip;", 8230 },
+
// A.2.2. Special characters cont'd
{ @"&permil;", 8240 },
-
- // A.2.3. Symbols cont'd
- { @"&prime;", 8242 },
- { @"&Prime;", 8243 },
+
+ // A.2.3. Symbols cont'd
+ { @"&prime;", 8242 },
+ { @"&Prime;", 8243 },
// A.2.2. Special characters cont'd
{ @"&lsaquo;", 8249 },
{ @"&rsaquo;", 8250 },
- // A.2.3. Symbols cont'd
- { @"&oline;", 8254 },
- { @"&frasl;", 8260 },
-
+ // A.2.3. Symbols cont'd
+ { @"&oline;", 8254 },
+ { @"&frasl;", 8260 },
+
// A.2.2. Special characters cont'd
{ @"&euro;", 8364 },
- // A.2.3. Symbols cont'd
+ // A.2.3. Symbols cont'd
{ @"&image;", 8465 },
- { @"&weierp;", 8472 },
- { @"&real;", 8476 },
- { @"&trade;", 8482 },
- { @"&alefsym;", 8501 },
- { @"&larr;", 8592 },
- { @"&uarr;", 8593 },
- { @"&rarr;", 8594 },
- { @"&darr;", 8595 },
- { @"&harr;", 8596 },
- { @"&crarr;", 8629 },
- { @"&lArr;", 8656 },
- { @"&uArr;", 8657 },
- { @"&rArr;", 8658 },
- { @"&dArr;", 8659 },
- { @"&hArr;", 8660 },
- { @"&forall;", 8704 },
- { @"&part;", 8706 },
- { @"&exist;", 8707 },
- { @"&empty;", 8709 },
- { @"&nabla;", 8711 },
- { @"&isin;", 8712 },
- { @"&notin;", 8713 },
- { @"&ni;", 8715 },
- { @"&prod;", 8719 },
- { @"&sum;", 8721 },
- { @"&minus;", 8722 },
- { @"&lowast;", 8727 },
- { @"&radic;", 8730 },
- { @"&prop;", 8733 },
- { @"&infin;", 8734 },
- { @"&ang;", 8736 },
- { @"&and;", 8743 },
- { @"&or;", 8744 },
- { @"&cap;", 8745 },
- { @"&cup;", 8746 },
- { @"&int;", 8747 },
- { @"&there4;", 8756 },
- { @"&sim;", 8764 },
- { @"&cong;", 8773 },
- { @"&asymp;", 8776 },
- { @"&ne;", 8800 },
- { @"&equiv;", 8801 },
- { @"&le;", 8804 },
- { @"&ge;", 8805 },
- { @"&sub;", 8834 },
- { @"&sup;", 8835 },
- { @"&nsub;", 8836 },
- { @"&sube;", 8838 },
- { @"&supe;", 8839 },
- { @"&oplus;", 8853 },
- { @"&otimes;", 8855 },
- { @"&perp;", 8869 },
- { @"&sdot;", 8901 },
- { @"&lceil;", 8968 },
- { @"&rceil;", 8969 },
- { @"&lfloor;", 8970 },
- { @"&rfloor;", 8971 },
- { @"&lang;", 9001 },
- { @"&rang;", 9002 },
- { @"&loz;", 9674 },
- { @"&spades;", 9824 },
- { @"&clubs;", 9827 },
- { @"&hearts;", 9829 },
+ { @"&weierp;", 8472 },
+ { @"&real;", 8476 },
+ { @"&trade;", 8482 },
+ { @"&alefsym;", 8501 },
+ { @"&larr;", 8592 },
+ { @"&uarr;", 8593 },
+ { @"&rarr;", 8594 },
+ { @"&darr;", 8595 },
+ { @"&harr;", 8596 },
+ { @"&crarr;", 8629 },
+ { @"&lArr;", 8656 },
+ { @"&uArr;", 8657 },
+ { @"&rArr;", 8658 },
+ { @"&dArr;", 8659 },
+ { @"&hArr;", 8660 },
+ { @"&forall;", 8704 },
+ { @"&part;", 8706 },
+ { @"&exist;", 8707 },
+ { @"&empty;", 8709 },
+ { @"&nabla;", 8711 },
+ { @"&isin;", 8712 },
+ { @"&notin;", 8713 },
+ { @"&ni;", 8715 },
+ { @"&prod;", 8719 },
+ { @"&sum;", 8721 },
+ { @"&minus;", 8722 },
+ { @"&lowast;", 8727 },
+ { @"&radic;", 8730 },
+ { @"&prop;", 8733 },
+ { @"&infin;", 8734 },
+ { @"&ang;", 8736 },
+ { @"&and;", 8743 },
+ { @"&or;", 8744 },
+ { @"&cap;", 8745 },
+ { @"&cup;", 8746 },
+ { @"&int;", 8747 },
+ { @"&there4;", 8756 },
+ { @"&sim;", 8764 },
+ { @"&cong;", 8773 },
+ { @"&asymp;", 8776 },
+ { @"&ne;", 8800 },
+ { @"&equiv;", 8801 },
+ { @"&le;", 8804 },
+ { @"&ge;", 8805 },
+ { @"&sub;", 8834 },
+ { @"&sup;", 8835 },
+ { @"&nsub;", 8836 },
+ { @"&sube;", 8838 },
+ { @"&supe;", 8839 },
+ { @"&oplus;", 8853 },
+ { @"&otimes;", 8855 },
+ { @"&perp;", 8869 },
+ { @"&sdot;", 8901 },
+ { @"&lceil;", 8968 },
+ { @"&rceil;", 8969 },
+ { @"&lfloor;", 8970 },
+ { @"&rfloor;", 8971 },
+ { @"&lang;", 9001 },
+ { @"&rang;", 9002 },
+ { @"&loz;", 9674 },
+ { @"&spades;", 9824 },
+ { @"&clubs;", 9827 },
+ { @"&hearts;", 9829 },
{ @"&diams;", 9830 }
};
@@ -325,11 +330,11 @@ static HTMLEscapeMap gUnicodeHTMLEscapeMap[] = {
{ @"&Scaron;", 352 },
{ @"&scaron;", 353 },
{ @"&Yuml;", 376 },
-
+
// Spacing Modifier Letters
{ @"&circ;", 710 },
{ @"&tilde;", 732 },
-
+
// General Punctuation
{ @"&ensp;", 8194 },
{ @"&emsp;", 8195 },
@@ -372,14 +377,14 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {
@implementation NSString (GTMNSStringHTMLAdditions)
-- (NSString *)gtm_stringByEscapingHTMLUsingTable:(HTMLEscapeMap*)table
- ofSize:(NSUInteger)size
- escapingUnicode:(BOOL)escapeUnicode {
+- (NSString *)gtm_stringByEscapingHTMLUsingTable:(HTMLEscapeMap*)table
+ ofSize:(NSUInteger)size
+ escapingUnicode:(BOOL)escapeUnicode {
NSUInteger length = [self length];
if (!length) {
return self;
}
-
+
NSMutableString *finalString = [NSMutableString string];
NSMutableData *data2 = [NSMutableData dataWithCapacity:sizeof(unichar) * length];
@@ -405,19 +410,19 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {
return nil;
// COV_NF_END
}
-
+
unichar *buffer2 = (unichar *)[data2 mutableBytes];
-
+
NSUInteger buffer2Length = 0;
-
+
for (NSUInteger i = 0; i < length; ++i) {
- HTMLEscapeMap *val = bsearch(&buffer[i], table,
- size / sizeof(HTMLEscapeMap),
+ HTMLEscapeMap *val = bsearch(&buffer[i], table,
+ size / sizeof(HTMLEscapeMap),
sizeof(HTMLEscapeMap), EscapeMapCompare);
if (val || (escapeUnicode && buffer[i] > 127)) {
if (buffer2Length) {
- CFStringAppendCharacters((CFMutableStringRef)finalString,
- buffer2,
+ CFStringAppendCharacters((CFMutableStringRef)finalString,
+ buffer2,
buffer2Length);
buffer2Length = 0;
}
@@ -434,29 +439,29 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {
}
}
if (buffer2Length) {
- CFStringAppendCharacters((CFMutableStringRef)finalString,
- buffer2,
+ CFStringAppendCharacters((CFMutableStringRef)finalString,
+ buffer2,
buffer2Length);
}
return finalString;
}
- (NSString *)gtm_stringByEscapingForHTML {
- return [self gtm_stringByEscapingHTMLUsingTable:gUnicodeHTMLEscapeMap
- ofSize:sizeof(gUnicodeHTMLEscapeMap)
+ return [self gtm_stringByEscapingHTMLUsingTable:gUnicodeHTMLEscapeMap
+ ofSize:sizeof(gUnicodeHTMLEscapeMap)
escapingUnicode:NO];
} // gtm_stringByEscapingHTML
- (NSString *)gtm_stringByEscapingForAsciiHTML {
- return [self gtm_stringByEscapingHTMLUsingTable:gAsciiHTMLEscapeMap
- ofSize:sizeof(gAsciiHTMLEscapeMap)
+ return [self gtm_stringByEscapingHTMLUsingTable:gAsciiHTMLEscapeMap
+ ofSize:sizeof(gAsciiHTMLEscapeMap)
escapingUnicode:YES];
} // gtm_stringByEscapingAsciiHTML
- (NSString *)gtm_stringByUnescapingFromHTML {
NSRange range = NSMakeRange(0, [self length]);
NSRange subrange = [self rangeOfString:@"&" options:NSBackwardsSearch range:range];
-
+
// if no ampersands, we've got a quick way out
if (subrange.length == 0) return self;
NSMutableString *finalString = [NSMutableString stringWithString:self];
@@ -480,9 +485,9 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {
NSString *hexSequence = [escapeString substringWithRange:NSMakeRange(3, length - 4)];
NSScanner *scanner = [NSScanner scannerWithString:hexSequence];
unsigned value;
- if ([scanner scanHexInt:&value] &&
+ if ([scanner scanHexInt:&value] &&
value < USHRT_MAX &&
- value > 0
+ value > 0
&& [scanner scanLocation] == length - 4) {
unichar uchar = (unichar)value;
NSString *charString = [NSString stringWithCharacters:&uchar length:1];
@@ -494,9 +499,9 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {
NSString *numberSequence = [escapeString substringWithRange:NSMakeRange(2, length - 3)];
NSScanner *scanner = [NSScanner scannerWithString:numberSequence];
int value;
- if ([scanner scanInt:&value] &&
+ if ([scanner scanInt:&value] &&
value < USHRT_MAX &&
- value > 0
+ value > 0
&& [scanner scanLocation] == length - 3) {
unichar uchar = (unichar)value;
NSString *charString = [NSString stringWithCharacters:&uchar length:1];