191 c = X2DIGITS_TO_NUM (h[1], h[2]);/*____________----------->/src/wget.h*/
192 /* Don't unescape %00 because there is no way to insert it
193 into a C string without effectively truncating it.,不要丢掉%00的情况,因为无法插入c字符串无法有效截断它 */
194 if (c == '\0')
195 goto copychar;
196 *t = c; /*转化后赋值给指针指向的地方。
197 h += 2;
198 }
199 }
200 *t = '\0';
201 }
#define X2DIGITS_TO_NUM(h1, h2) ((XDIGIT_TO_NUM (h1) << 4) + XDIGIT_TO_NUM (h2))
#define XDIGIT_TO_NUM(h) ((h) < 'A' ? (h) - '0' : c_toupper (h) - 'A' + 10)
/*此处判断%号后面如果不为NULL ,而且都为16 进制数的话,那么就进行宏定义的判断,将这些字符转化成十进制的ASCII码,后面加的是加10是转化到10-15之间的数,16进制a以上至少为10。*/
/*此处<<4因为是高四位*/
<---------------------____________________________
转化第一个字符串。返回到append_uri_pathel()
1393 b = unescaped;
1394 e = unescaped + strlen (unescaped);/*这是期望的那个字符串地址。
1399 if (e - b == 2 && b[0] == '.' && b[1] == '.')
1400 {
1401 b = "%2E%2E";
1402 e = b + 6;
1403 } /*如果发现期望字符串和input字符串之间地址差二,而iput地址为b[0],b[1]那么就就上述那样,期望地址从b+6的地方开始,提防恶意输入*/
1407 quoted = 0;
1408 for (p = b; p < e; p++)
1409 if (FILE_CHAR_TEST (*p, mask)) /*遍历路径字符串,看看需要多少字符串1、_____------->url.c*/
1410 ++quoted;
1、______--------->
1300 #define FILE_CHAR_TEST(c, mask) \
1301 ((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \ /*这两个判断字符值是否大于127,上面这个式子非常妙,自己分析吧*/
1302 (filechr_table[(unsigned char)(c)] & (mask))) /*mask
是前面的一系列赋值,
filechr_table是数量为256个的表。如果c的值大于127那么会用两个8进制数据来表示或者当在filechar_table中命中,那么
此值为int类型。*/
1415 outlen = (e - b) + (2 * quoted);
1416 GROW (dest, outlen);
1417
1418 if (!quoted)
1419 {
1420 /* If there's nothing to quote, we can simply append the string
1421 without processing it again. */
1422 memcpy (TAIL (dest), b, outlen); /*如果没有要引用的,那么拷贝到dest的尾部*/
1423 }
1424 else
1425 {
1426 char *q = TAIL (dest);
1427 for (p = b; p < e; p++)
1428 {
1429 if (!FILE_CHAR_TEST (*p, mask)) /*如果没有可以引用的值就拷贝过去*/
1430 *q++ = *p;
1431 else
1432 {
1433 unsigned char ch = *p;
1434 *q++ = '%'; /*否则用这种格式来来处理,再转化成字符原来16进制形式*/
1435 *q++ = XNUM_TO_DIGIT (ch >> 4);
1436 *q++ = XNUM_TO_DIGIT (ch & 0xf);
1437 }
1438 }
1439 assert (q - TAIL (dest) == outlen); /*断言是否相等*/
1440 }
1441
1442 /* Perform inline case transformation if required. */
1443 if (opt.restrict_files_case == restrict_lowercase
1444 || opt.restrict_files_case == restrict_uppercase)
1445 {
1446 char *q;
1447 for (q = TAIL (dest); q < TAIL (dest) + outlen; ++q)
1448 {
1449 if (opt.restrict_files_case == restrict_lowercase)
1450 *q = c_tolower (*q); /*给输出部分改变格式*/
1451 else
1452 *q = c_toupper (*q);
1453 }
1454 }
1455
1456 TAIL_INCR (dest, outlen); /*改变末端地址*/
1457 }
<------------------____________________
回到 test_append_uri_pathel()
2232 append_char ('\0', &dest);_________-------------->/src/url.c*/
2233
2234 mu_assert ("test_append_uri_pathel: wrong result",
2235 strcmp (dest.base, test_array[i].expected_result) == 0); /*比较dest的字符串和期望的是否相同。不相等的话就打印出错误值
2236 }
________------------>
1287 append_char (char ch, struct growable *dest)
1288 {
1289 GROW (dest, 1);
1290 *TAIL (dest) = ch;
1291 TAIL_INCR (dest, 1); /*给最后的字符串加\0*/
1292 }
阅读(591) | 评论(0) | 转发(0) |